为什么两个程序中的sum值最终都不同?

时间:2017-07-27 20:36:28

标签: c++ primes

计划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之间的所有素数的总和

2 个答案:

答案 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,我得到了错误的回答。 运行此命令以通过垃圾值

查看1
#include<iostream>

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

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