求1到100之间质数的程序问题
Problems with program which find prime number from 1 to 100
我编写了这个程序,它查找并显示从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循环中允许i
为n
,所以每个自然数都可以被自己整除,所以它错误地指责质数是合数。正如人们指出的,快速解决办法是:
while (i < n)
但是我回复的原因是因为你可以做其他的事情来使你的代码更好。第一个改进是,您不需要尝试除以大于n
平方根的数,因为如果有大于它的数,那么也有小于它的数。所以你可以这样做:
while (i*i <= n)
但是你可以在这方面做进一步的改进。例如,为什么每次迭代都要计算i*i ?如果预先计算了n
的平方根(四舍五入为整型),则可以避免该计算。
另一个优化是您可以避免尝试除以一半的数字:如果n
不能被2整除,那么没有理由尝试任何其他偶数。所以你可以在你的内循环中每次把i
跳2。如果你想消除trial除以能被3整除的数,还有其他技巧。
实际上,如果你不介意使用x
字节的内存,有一个很好的超级超级快速的算法来找到第一个x
质数。它被称为埃拉托色尼筛子,实施起来真的很有趣。一旦您优化了当前的代码,我建议您尝试筛子。
有效地找到素数的问题在学术文献中受到了极大的关注,现在被认为已经解决了。但是要学会它需要大量的学习。
相关文章:
- C++程序问题:抛出'std::invalid_argument'实例后终止调用
- 测试外壳,插入和快速的程序问题
- Mongodb c ++驱动程序问题
- 输出中的特定递归反向程序问题
- C++ std::endl 的多线程程序 I/O 问题
- 我如何利用核心文件在C/C 中找到应用程序问题
- 套接字 TCP 服务器程序问题
- C++,结构数据库程序问题
- visual c++程序问题
- C++多个程序问题(rand、转换、崩溃)
- 非常基本的C++程序问题 - 二进制表达式的操作数无效
- C++练习车辆程序问题 - 初学者编程
- 关于堆和堆栈应用程序问题
- Boost asio:io服务在销毁步骤中被阻止了更多的处理程序问题
- 使用链接linux编译GLFW应用程序问题
- C++计算器程序.问题
- 基于WIndows - manifest的ETW提供程序问题
- 求1到100之间质数的程序问题
- 文件加载程序问题
- mfcc++托盘应用程序问题