素数搜索中的C ++数组

时间:2015-02-08 04:39:52

标签: c++ arrays

所以我试图回答关于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;时改变

3 个答案:

答案 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'.
}