程序问题,从1到100找到素数

时间:2014-07-15 21:02:54

标签: c++

我写了这个程序,找到并显示从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;
}

程序什么也没显示。为什么呢?

4 个答案:

答案 0 :(得分:1)

正如评论中所指出的,每个非零数字都可以被1和它自身整除。改变这一行(第4行)

while (i<= n)

while (i< n)

答案 1 :(得分:1)

如果这是您的整个代码,那么您只是错过了main()功能。

虽然它不应该在没有main()功能的情况下进行链接。

您的代码还存在一些其他问题,但这可能是您没有看到任何输出的原因。

尝试将此添加到您的文件中:

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

答案 2 :(得分:1)

将您的循环更改为:

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

或者你的终极条件:

while(i < n-1)

答案 3 :(得分:0)

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

while (i <= n)

...因为你允许{for循环中i成为n,所以每个自然数都可以被自身整除,所以它错误地指责素数是复合数。正如人们所指出的那样,快速修复是:

while (i < n)

但我回复的原因是因为您可以采取其他措施来改善您的代码。第一个改进是你不需要尝试除以大于n的平方根的数字,因为如果有大于它的数,那么还有一个小于它的除数。所以你可以这样做:

while (i*i <= n)

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

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

但是,如果你不介意使用x个字节的内存,那么有一个很好的超级快速算法可以找到第一个x素数。它被称为sieve of Eratosthenes,它实现起来非常有趣。一旦优化了当前的代码,我建议您尝试筛选。

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