#include<iostream>using namespace std;int prime(int n){ if(n%2==0) return (n==2); if(n%3==0) return 0; if(n%5==0) return 0; for(int i=7;i*i<n;i=i+2) if(n%i==0)return 0; return 1;}int main(){ int N; cout<<"请输入一个数int:"<<endl; while(1) { cin>>N; if(!cin||N<2) { cin.clear(); cout<<"请重新输入!"; continue; } break; } int total=0; for(int i=2;i<=N;i++) { if(prime(i)) { cout<<i<<endl; total++; } } cout<<"一共有"<<total<<"个素数。"; system("pause");}第一个问题:如果用户输入的值小于2,或者输入非法就要求重新输入。然而那一段代码我在编译的时候,输入的如果是负数的确可以正常运行,然而如果输入一个字符,那么while将无限循环,无限出现“请重新输入”。这是为什么?第二个问题,我尝试了一下,100以内素数的个数是对的。然而我在求1000以内的素数个数的时候,出现了174个,实际上是168个,为什么多了几个呢?问题出在哪里呢,如果代码有问题,为什么数字小的时候却没有出错呢?
3 回答
慕用1759030
TA贡献1条经验 获得超1个赞
#include<iostream> #include<math.h> using namespace std; int prime(int n) { for(int i=2;i<=sqrt(double(n));i++) { if(n%i==0) return 0; } return 1; } int main() { int N; cout<<"请输入一个数int:"; while(1) { cin>>N; if(!cin||N<2) { cin.clear(); cin.ignore();//清除当前行 cout<<"请重新输入!"; continue; } break; } int total=0; for(int i=2;i<=N;i++) { if(prime(i)) { cout<<i<<endl; total++; } } cout<<"一共有"<<total<<"个素数。"; system("pause"); } //试一下,这个应该是可以的
努力提升
TA贡献65条经验 获得超15个赞
主要你的素数判断写的有问题,1000以内出错主要是,像11的平方121,13的平方169,都不能整除你列出的那些就能说它们是素数了吗?判断素数的函数可以写成这样:
void Prime(int m)
{
int i,n;
for(n=2;n<=m;n++)
{
for(i=2;i<=sqrt(n);i++)
{
if(n%i==0)
break;
}
if(i>sqrt(n)) //验证成功了,表示是质数,输出这个数
cout<<n<<" ";
}
}
- 3 回答
- 0 关注
- 1929 浏览
添加回答
举报
0/150
提交
取消