计划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的值。谁能告诉我为什么会这样? 计划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之间的所有素数的总和
答案 0 :(得分:1)
在此代码中创建自动数组并动态分配时:
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)
好吧,我得到了它背后的逻辑,当我没有初始化数组时,它也需要垃圾值,当时可能是1和0,因为正在检查
if(a[i] != 1)
{
sum = sum + i + x;
}
所以由于垃圾价值放置了a[i] == 1
,我得到了错误的回答。
运行此命令以通过垃圾值
#include<iostream>
int main()
{
int a[100000];
for(int i = 0; i < 100000; i++)
std::cout << a[i] << std::endl;
}
但仍然不知道,为什么cout声明纠正了它?