c++里查找素数的函数问题

#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");

}

  1. 第一个问题:如果用户输入的值小于2,或者输入非法就要求重新输入。然而那一段代码我在编译的时候,输入的如果是负数的确可以正常运行,然而如果输入一个字符,那么while将无限循环,无限出现“请重新输入”。这是为什么?

  2. 第二个问题,我尝试了一下,100以内素数的个数是对的。然而我在求1000以内的素数个数的时候,出现了174个,实际上是168个,为什么多了几个呢?问题出在哪里呢,如果代码有问题,为什么数字小的时候却没有出错呢?

听雨0
浏览 1945回答 3
3回答

慕用1759030

#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"); } //试一下,这个应该是可以的

努力提升

输入的我再看看

努力提升

主要你的素数判断写的有问题,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<<" "; }  }
打开App,查看更多内容
随时随地看视频慕课网APP