-1

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

#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++;
    }
}
4

3 回答 3

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;
    }
}
于 2013-04-25T02:10:23.363 回答
1

这个

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

应该是这个

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

这是一个常见的错误。但更好的是意识到您不需要将布尔值与真假进行比较,因为它们真或假。所以就

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。

于 2013-04-18T10:32:10.147 回答
1

好吧,让我眼前一亮的是你永远不会增加 y。

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

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

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

但是,这应该做你想要的:

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,这是一个重要的优化...!

编辑2:

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

于 2013-04-18T10:52:46.760 回答