gpt4 book ai didi

c++ - 为什么最后两个程序中的 sum 值不同?

转载 作者:行者123 更新时间:2023-11-28 05:03:32 25 4
gpt4 key购买 nike

程序 1.

#include<iostream>       
using namespace std;
int main()
{
int a[100000];
int *b=new int[1000000];
//for(int i=0;i<100000;i++)
//a[i]=0;
long long int sum=0;
const long long int x=1000000000000ll;
for(long long int i=2;i<1000000;i++)
{

if(b[i]==1)
continue;
for(long long int j=i*i;j<1000000;j+=i)
b[j]=1;

long long int k=((x-1)/i+1)*i-x;
//Sieve upto 10^12+10^5
for(;k<100000;k+=i)
a[k]=1;
}

for(int i=0;i<100000;i++)
{
if(a[i]!=1)
{
cout<<i+x<<" "<<i%1000<<endl;
sum=sum+i+x;


}

}

cout<<"sum="<<sum;
}

在第二个程序中,当我在打印 sum 之前打印一些值时,它正在改变程序中 sum 的值。谁能告诉我为什么会这样?方案二

#include<iostream>
using namespace std;
int main()
{
int a[100000];
int *b=new int[1000000];
//for(int i=0;i<100000;i++)
//a[i]=0;
long long int sum=0;
const long long int x=1000000000000ll;
for(long long int i=2;i<1000000;i++)
{

if(b[i]==1)
continue;
for(long long int j=i*i;j<1000000;j+=i)
b[j]=1;

long long int k=((x-1)/i+1)*i-x;
//Sieve upto 10^12+10^5
for(;k<100000;k+=i)
a[k]=1;
}

for(int i=0;i<100000;i++)
{
if(a[i]!=1)
{

sum=sum+i+x;


}

}

cout<<"sum="<<sum;
}

它似乎缺少我要求和的两个值。基本上 sum 是 10^12 到 10^12+10^5 之间所有素数的总和

最佳答案

当您在此代码中创建自动数组并动态分配一个数组时:

int a[100000];
int *b=new int[1000000];

它们是未初始化的。稍后您从 b 读取:

if(b[i]==1)

这导致 UB。您确实为这段代码中的 a 分配了一些值:

for(;k<100000;k+=i)
a[k]=1;
}

但不清楚是否所有数据都赋值了。如果不进一步阅读它也会导致 UB。您应该在使用前初始化您的数据,以消除 UB 并停止获得不可预测的结果。

PS 根据注释掉的代码,您尝试初始化 a,但这还不够,还必须初始化 b

注意:由 new[] 分配的内存应该由 delete[] 释放,尽管这不是您代码中问题的根源。您最好使用 std::vector,它不仅负责内存分配,而且会正确初始化您的数据。

关于c++ - 为什么最后两个程序中的 sum 值不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45360562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com