#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 关注
- 2136 浏览
添加回答
举报
0/150
提交
取消
