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

问题描述:

程序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; 
} 

它看起来就像是缺少两个值,我要进行总结。 基本上总和之间的总的所有素数的10^12至10^12 + 10^5

+3

找出哪个程序是正确的,然后调试不正确的程序。 – Carcigenicate

+3

专业提示:正确地格式化您的代码会使调试更容易。 –

+0

程序1的输出是期望的输出。 –

当创建自动阵列和动态分配的一个在此代码:

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

它们unintialized。稍后,您从b读取:

if(b[i]==1) 

它导致UB。你做这个代码分配一定的参考价值a

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

,但如果所有的数据被分配目前尚不清楚。如果没有进一步阅读,也会导致UB。您应该在使用之前初始化数据以消除UB并停止获得不可预知的结果。

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

注意:由new[]分配的内存应该由delete[]发布,尽管这在您的代码中并不是问题的根源。您最好使用std::vector,它不仅可以处理内存分配,还可以正确初始化数据。

好,我知道它背后的逻辑,当我不intialize阵列,它需要的时候可能是1和0的垃圾也值,因为被检查

如果(A [1]!= 1 ) {

sum=sum+i+x; 


} 

所以由于A [1]是被投入垃圾值== 1,我是越来越错误的答案。 运行此垃圾值

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

看,1 **,但仍没有不知道,为什么COUT声明更正它? **