如何在c ++中打印所有素数?

时间:2013-04-18 10:25:04

标签: c++ primes

我正在尝试打印系列中的所有素数,我最终得到的代码在下面,而不是打印所有素数,它打印随机数,有些是素数,有些则不是:/ 为什么会这样?

#include <iostream>

using namespace std;

long int x,y=3;
int a=3;
bool isprime;

int main()
{
    while(a<=100)
    {
    for(x=2;x<=y;x++)
    {
        if(y%x==0 && x!=y)
        {
            isprime=false;
            break;
        }
        else if(y%x!=0 && x!=y)
        {
            isprime = true;
        }

    }
    if(isprime==true  && y%x!=0 && x!=y)
    {
        cout<<a<<" is a prime number."<<"\n";
        isprime=false;
    }

      a++;
      y++;
    }
}

3 个答案:

答案 0 :(得分:1)

if(isprime=true && a%x!=0 && a!=y)

应该是这个

if(isprime==true && a%x!=0 && a!=y)

这是一个常见的错误。但更好的是要意识到你不需要将bool与false的真实比较,因为它们是真还是假。所以只是

if (isprime && a%x!=0 && a!=y)

逻辑看起来都错了(而且太复杂了),试试这个

    isprime = true;
    for(x=2;x<a;x++)
    {
        if(a%x==0)
        {
            isprime = false;
            break;
        }
    }
    if (isprime)
    {
        cout<<a<<"\n";
    }

不需要y。

答案 1 :(得分:1)

那些跳进我眼中的是你永远不会增加y。

y在开头是3,所以你只能尝试2是a的可能除数然后转到下一个a。

无论如何,我不确定你想用y实现什么。

让x从2运行到a / 2,因为不需要尝试大于a / 2的数字。 这只是因为从来没有比a / 2更大的除数。 示例:a = 30.尝试除以16或更大是没有意义的,因为结果永远不会是整数(当然除了它本身)

然而,这应该做你想要的:

int x = 0; 
int a = 0;
bool isPrime = false;

for(a=3; a < 100; a+=2) 
{
    isPrime = true;
    for(x = 2; x <= a/2; x++) {
        if(a%x == 0) {
            isPrime = false;
            break;                                     
        }                    
    }
    if(isPrime) {
        cout << a << "\n";            
    }
}    

当然有其他算法可以找到素数,但我想基本上使用你的方法。

干杯

克里斯

编辑: 有人速度更快:)。

无论如何:没有必要高于a / 2运行,这是一个重要的优化......!

EDIT2:

另一个优化当然是跳过所有偶数,所以从a = 3开始,每次循环迭代递增2 ...

答案 2 :(得分:1)

我现在看到你的代码还可以。 然而,我做了一些小改动,清理代码并使其更快一些。

#include <iostream>

using namespace std;

long int x, y = 2;
int a = 3;
bool isprime;

int main() {
    while (a <= 100) {
        while ((y + 1) * (y + 1) <= a) {
            y++;
        }

        isprime = true;
        for (x = 3; x <= y; x += 2) {
            if (a % x == 0) {
                isprime = false;
                break;
            }
        }
        if (isprime) {
            cout << a << " is a prime number." << "\n";
        }

        a+=2;
    }
}