为什么两个程序中的总和值在最后不同?

Why are the values of sum in both program different at the end?

本文关键字:最后 两个 程序 为什么      更新时间:2023-10-16

program 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;
}

在第二个程序中,当我在打印总和之前打印一些值时,它会更改程序中的总和值。谁能告诉我为什么会这样?计划2

#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

好的,我得到了它背后的逻辑,当我不初始化数组时,它也可能需要垃圾值,也可能是 1 和 0,因为正在检查

if(a[i] != 1)
{
sum = sum + i + x;
}

因此,由于垃圾价值的a[i] == 1,我得到了错误的答案。 运行此命令以查看垃圾值为 1

#include<iostream>
int main()
{
int a[100000];
for(int i = 0; i < 100000; i++)
std::cout << a[i] << std::endl;
}

但仍然不知道,为什么 cout 声明纠正了它??