为什么两个程序中的总和值在最后不同?
Why are the values of sum in both program different at the end?
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 声明纠正了它??
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 两个字符串在 c++ 中不相等
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 两个文件使用彼此的功能-如何解决
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 为什么两个程序中的总和值在最后不同?
- 为什么我的代码不给最后两个数字
- 图论 - 从顶点 A 开始,遍历两个方向的所有路径,最后以最短的方式再次到达 A
- 无法从列表末尾获取最后两个所需的元素 c++,mfc
- 最后一行欧普特两个组合输出问题?如果其他语句
- 为什么比较两个字符串的结果遗漏了最后匹配的字符串
- c++ 如何根据最后一个字符串将字符串拆分为两个字符串'.'
- 程序查找并打印第一个完全正方形 (i*i),其最后两位数字都是奇数
- Adjacent_find不检测最后两个元素
- 使用VBO时,glVertexAttribPointer的最后两个参数