我写了这个程序,找到并显示从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;
}
程序什么也没显示。为什么呢?
答案 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,它实现起来非常有趣。一旦优化了当前的代码,我建议您尝试筛选。
有效地找到素数的问题在学术文献中受到了极大的关注,现在它被认为已经解决了。但要学习它需要大量的研究。