所以我试图回答关于Project Euler的问题(问题是:找到10,001素数),并遇到了一个我不知道为什么会发生的问题。当我运行以下C ++代码时,
#include <iostream>
using namespace std;
int main()
{
int arr[10001]={2}, term=1, i, num=3;
while(term!=10001)
{
for(i=0; i<term; i++)
{
if(num%arr[i]==0){
break;
}
}
if(i==term){
arr[term]=num;
cout<< arr[term]<< " is prime"<< endl;
term++;
}
num++;
}
cout<< arr[term]<< endl;
}
我总是cout<< arr[term]<< endl;
打印出n++;
(在这种情况下的下一个数字,但是如果我要将其更改为n=856
那么它会打印出该数字)。我不明白为什么这个数组术语会改变,因为我认为它只会在执行arr[term]=num;
时改变
答案 0 :(得分:1)
您的代码有 undefined behaviour ,因为您正在访问其边界之外的数组。
当循环中断时,term
的值为10001
,这是数组arr
的第10002个元素,而您的数组内存仅分配给10001
个元素。
要打印数组的最后一个元素,请执行:
cout<< arr[term - 1]<< endl;
答案 1 :(得分:1)
在每次迭代中,执行
arr[term]=num;
cout<< arr[term]<< " is prime"<< endl;
term++;
因此,当while
结束时,term
比您最后一次分配时使用的更多一次。
答案 2 :(得分:1)
您必须输出arr[term-1]
而不是arr[term]
,因为term
会在arr[]
的分配结束时递增,因此term
变量还有1个10001
。
编辑代码:
#include <iostream>
using namespace std;
int main()
{
int arr[10002]={2}, term=1, i, num=3;
while(term!=10001)
{
for(i=0; i<term; i++)
{
if(num%arr[i]==0){
break;
}
}
if(i==term){
arr[term]=num;
cout<< arr[term]<< " is prime"<< endl;
term++;
}
num++;
}
cout<< arr[term-1]<< endl;
//Your 'term' variable actually is term + 1, hence, you have
//to print the element at 'term - 1'.
}