为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
听雨0 2016-01-12 07:20:52
#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");
}
//试一下,这个应该是可以的


查看完整回答
1 反对 回复 2016-01-12
?
努力提升

TA贡献65条经验 获得超15个赞

输入的我再看看

查看完整回答
反对 回复 2016-01-12
?
努力提升

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

}



查看完整回答
反对 回复 2016-01-12
  • 听雨0
    听雨0
    嗯,谢谢,帮我找到了错误。但是你的程序里也有一些错误 1.sqrt原型里没有int类型的参数。 2.i*i乘法运算,貌似比开方运算占用的时间更少,在运算一个大的数据的时候优势应该可以显现出来。 3.总之,很感谢。
  • 3 回答
  • 0 关注
  • 1929 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信