求1到100之间质数的程序问题

Problems with program which find prime number from 1 to 100

本文关键字:程序 问题 之间      更新时间:2023-10-16

我编写了这个程序,它查找并显示从1到100的素数

int ifprime (int n)
{
    int i=1;
    while (i<= n)
    {
        i++;
        if (n%i == 0) 
        {
            return false;
            break;
        }
        else continue;
    }
    return true;
}
int prime_numbers (void)
{
    bool result;
    for (int i = 2; i<=100; ++i)
    {
        result = ifprime(i);
        if (result==true) cout<<i<<endl;
        else continue;
    }
}
int main()
{
    prime_numbers();
    return 0;
}

程序不显示任何内容。为什么?

将循环设置为:

for(int i=2; i<n; i++){
    if(n%i==0){
         return false;
    }
}

或者你的while结束条件为:

while(i < n-1)

正如在注释中指出的,每个非零的数都能被1和自身整除。修改这一行(第4行)

while (i<= n)

while (i< n)

如果这是你的全部代码,那么你只是缺少一个main()函数。

如果没有main()函数,它不应该链接。

你的代码有一些额外的问题,但这可能是你没有看到任何输出的原因。

试着把这个添加到你的文件中:

int main()
{
    prime_numbers();
    return 0;
}

很多人都指出了这个问题:

while (i <= n)

…因为在for循环中允许in,所以每个自然数都可以被自己整除,所以它错误地指责质数是合数。正如人们指出的,快速解决办法是:

while (i < n)

但是我回复的原因是因为你可以做其他的事情来使你的代码更好。第一个改进是,您不需要尝试除以大于n平方根的数,因为如果有大于它的数,那么也有小于它的数。所以你可以这样做:

while (i*i <= n)

但是你可以在这方面做进一步的改进。例如,为什么每次迭代都要计算i*i ?如果预先计算了n的平方根(四舍五入为整型),则可以避免该计算。

另一个优化是您可以避免尝试除以一半的数字:如果n不能被2整除,那么没有理由尝试任何其他偶数。所以你可以在你的内循环中每次把i跳2。如果你想消除trial除以能被3整除的数,还有其他技巧。

实际上,如果你不介意使用x字节的内存,有一个很好的超级超级快速的算法来找到第一个x质数。它被称为埃拉托色尼筛子,实施起来真的很有趣。一旦您优化了当前的代码,我建议您尝试筛子。

有效地找到素数的问题在学术文献中受到了极大的关注,现在被认为已经解决了。但是要学会它需要大量的学习。