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

How to print all prime numbers in c++?

本文关键字:打印 c++      更新时间:2023-10-16

我试图打印所有素数系列,我最终得到的代码如下,而不是打印所有素数,它打印随机数,有些是素数,有些不是:/为什么会这样呢?

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

This

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

应该是这个

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

这是一个常见的错误。但更好的是意识到你不需要将bool与true或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

让我眼前一亮的是你从来没有增加过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,这是一个重要的优化…!

EDIT2:

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

我看到你的代码现在是ok的。尽管如此,我还是做了一些小的改变,清理了代码,使它更快了一点。

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