计算素数;程序运行/崩溃超过6657;

时间:2014-04-12 22:57:47

标签: c++ visual-studio-2013 primes

我试图通过编写一个计算特定数字的素数的程序来教自己一些CPP。我在Win 8.1 Pro(x64)的第三代i5@2.8GHz(x4)和8GB内存的笔记本电脑上使用Visual Studio Express 2013。我是cpp的新手(可能很明显),但我希望让这个程序在6657以后运行得更高。任何想法都将不胜感激!

编辑:这个程序的新版本按预期工作并使用向量。谢谢你的帮助!

/*
* Prime finder, starts at 2 works up, was working initially
* to 6658, now can run to 150000(highest tested yet) in ~17m25s.
* May need optimization. Uses vector size to check for nth number.
* Must have #include <vector>
*/

std::vector<int> prime;  // required for program to work. 
int primes(unsigned y){
    using namespace std;
    unsigned b = 0;
    bool z = true; prime.push_back(2);
    for (b = 2; prime.size() <= y; b++){
        if (b % 2 == 0 && b < y){ b++; }//catches even numbers.
        //finds primes to the nth integer
                /*decrementing in this loop produced a strange
                 *end count, used increments instead counts fixed
                 *and program completes sooner.
                 */

            for (unsigned j = 2; j < prime.size(); j++){
                //if (j > y){ return 0; }//catches infinite loop                
                if (prime.at(j) >= (b/2))
                    //removes unneccessary checking
                {break;}
                if (b%prime.at(j) == 0)
                {z = false; j = prime.size();}
            }
            if (z == true){ prime.push_back(b); }
            z = true;
        }
    }return 0;
}

2 个答案:

答案 0 :(得分:4)

这一行

int prime [] = {0}; //程序运行所必需的。必须初始化。

为正好一个素数创建空间。

因此,当prime[1]prime[j-1]的{​​{1}}或j > 1 prime[a]的值为a > 1时,您将超出数组范围。< / p>

您需要:

  1. 使用vector<int> primeprime.push_back(i);
  2. 使用int prime[SOMENUMBER] = { 0 };
  3. 使用vector<int>还有一个好处,就是您不需要使用素数存储prime[0]。相反,你有一个prime.size()函数,告诉你有多少元素。

答案 1 :(得分:3)

int prime[] = {0};

该数组的大小仅为1,但您稍后会使用较大的索引。这不应该适用于除零之外的任何其他值,但出于某种原因你很幸运。尝试增加数组大小或使用动态数据。