实施素数计数器

时间:2015-06-11 14:38:01

标签: c++ algorithm math primes

出于某种原因,我的最后一个素数(int prime)最终没有显示出来。任何线索? fyi:primeEval代表一个标志,如果循环结束&& primeEval == 2,该数字实际上是素数。 qty代表计数的素数。

int main(){


long primeEval=0,prime=0,qtyprime=0;

time_t timerr=(time(NULL)+10);



   for (int i = 2; time(NULL)!=timerr; i++) {

        for (int j = 1; j <= i; j++) {

            if((i%j)==0 && primeEval<2){

                primeEval++;

                if (i==j && primeEval==2) {
                    qtyprime++;
                    prime=i;
                    primeEval=0; // Resets for the next number 'i'

                }
            }

        }
    }

cout << "last prime found: " << prime << endl << "Ttal primes found: " << qtyprime;
}

2 个答案:

答案 0 :(得分:2)

新答案:

随着代码的更改,您现在将遍历所有数字。现在的问题是,一旦找到非素数,你永远不会重置primeEval,因此你永远不会捕获另一个素数如果你将你的代码更改为以下它将起作用

int main()
{
    long primeEval = 0, prime = 0, qtyprime = 0;
    time_t timerr = (time(NULL) + 10);

    for (int i = 2; time(NULL) != timerr; i++) {

        for (int j = 1; j <= i; j++) {

            if ((i%j) == 0){
                primeEval++;  // incmrent factor
            }
            // if we are at the end and have 2 factors then we are prime
            if (i == j && primeEval == 2) {
                qtyprime++;
                prime = i;
                primeEval = 0; // Resets for the next number 'i'
            }
            // if we reach the end with more than 2 factors reset and go to the next number
            if (i == j && primeEval > 2) {
                primeEval = 0; // Resets for the next number 'i'
            }
        }
    }
    cout << "last prime found: " << prime << endl << "Ttal primes found: " << qtyprime;
    cin.get();
    return 0;
}

我还建议您查看Which is the fastest algorithm to find prime numbers?以找到更有效的方法来获取素数。

旧答案:

在您的代码中,您有:

for (int i = 2; time(NULL)!=timerr; i=+2)

因此,当您从素数开始检查时,您从2开始,这是素数。然后你将i增加2,这样你检查的下一个数字是4,这是一个偶数。除了2之外,所有偶数都不是素数。因为你总是加2,你总是有一个偶数,所以唯一的素数是2。

答案 1 :(得分:0)

您有不同的问题:

for (int i = 2; time(NULL)!=timerr; i=+2) {

这里的语法错误:它必须是i+=2,而不是i=+2,否则你会将i设置为+2并测试2是否为素数。

然后,正如其他人指出的那样,为什么你将i增加2?如果您想优化搜索,则应将j增加2,而不是i!并且j在任何情况下都应该从2开始(或者,从你的方法开始,从1开始),然后你应该尝试j = 3然后你可以将j增加2而不会有跳过一些重要除数的风险。

然后,只有在找到素数时才将primeEval重置为0。如果您测试的数字i不是素数,则primeEval保持为2,您将再也不会进入该块。

所以最终的代码可能是:

#include <iostream>
using namespace std;

int main(){

    long primeEval=0,prime=0,qtyprime=0;

    time_t timerr=(time(NULL)+10);

    for (int i = 2; time(NULL)!=timerr; i++) {
        primeEval=0;
        for (int j = 1; j <= i; j++) {
            if((i%j)==0 && primeEval<2){
                primeEval++;
                if (i==j && primeEval==2) {
                    qtyprime++;
                    prime=i;
                    primeEval=0; // Resets for the next number 'i'
                }
            }
        }
    }

    cout << "last prime found: " << prime << endl << "Ttal primes found: " << qtyprime;
}