为什么两个程序中的总和值不同?
问题描述:
程序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
答
当创建自动阵列和动态分配的一个在此代码:
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声明更正它? **
找出哪个程序是正确的,然后调试不正确的程序。 – Carcigenicate
专业提示:正确地格式化您的代码会使调试更容易。 –
程序1的输出是期望的输出。 –