c++求素数的方法实例与解析



c++求素数的方法实例与解析。

用c++求100以内的素数

麻烦解释一下以下代码是如何实现求100以内的素数
#include <iostream.h>
#include <math.h>
int main()
{
 int i,j,m,sum=0;
 for(i=2;i<=100;i++)
 {
  m=int(sqrt(i));   
  for(j=2;j<=m;j++)
  {
   if(i%j==0)break;  
  }
  if(j>m)     
  {
   cout<<i<<"\t";
   sum++;
   if(sum%5==0)cout<<endl;//输出5个素数就换行一次
  }
 }
 return 0;

分享到:

2013-08-02 18:42

提问者采纳

for(i=2;i<=100;i++)  //因为题目是求100以内的质数,所以检查2至100之间的数据,循环从2到100
{
 //以下,是针对每个i进行检查,如果是质数,则输出,否则继续循环,检查下一个数
 m=int(sqrt(i));  //对i进行开方,取得i的算术平方根   m    
 for(j=2;j<=m;j++) //检查2到m中是否有i的因数
 {
  if(i%j==0)break;   //如果检查到有因数则结束j的循环
 }
 if(j>m)     //如果j的循环检查中,没有找到i的因数,则此时j=m+1>m,说明i是质数
 {
  cout<<i<<"\t";
  sum++;
  if(sum%5==0)cout<<endl;//输出5个素数就换行一次
 }

关于为什么只需要验证到m就可以确定一个数是不是质数,原理如下:
x = a * b ;
a <= 根号x   b >=根号x
这个数学原理,想一想就明白了。
提问者评价


太感谢了

#include
#include int main()
{
int i,j,m,sum=0;
for(i=2;i<=100;i++)
{
m=int(sqrt(i)); //为啥m是i的平方根,其实除到平方根没有整除的,后面就不用除了~

for(j=2;j<=m;j++)//素数的定义知道吧,这个for循环就是判断除了1和自身以外有没有能整除的数字 { if(i%j==0)break; } if(j>m)
{
cout<<i<<”\t”;
sum++;
if(sum%5==0)cout<<endl;//输出5个素数就换行一次
}
}
return 0;

 

 

C++使用筛选法求100以内的素数

   C++使用筛选法求100以内的素数,具体问题分析及其代码如下:
  【问题分析】
我们可以把100个数看作是沙子和石子,素数是石子,非素数的是沙子,弄个筛子,将沙子筛掉,剩下的就是素数。
1至100这些自然数可以分为三类:
(1) 单位数:仅有一个数1.
(2) 素数:这个数大于1,且只有它本身和1这样两个正因数。
(3) 合数:除了1和他自身以外,还有其他的正因数。
【代码如下】
/********************************************************
/* 程 序 名:素数筛选
/* 编程时间:2009年7月27日
/* 主要功能:求素数
*********************************************************/
#include<iostream>
using namespace std;//编译命令
#include<math.h>
const int MAX=100;//定义常量MAX
int main()//主函数
{
int prime[MAX+100]={0};//定义变量并初始化
int i,j,k=sqrt(MAX);
for(i=2; i<=k; i++)//枚举筛数
{
if(prime[i]==0)//如果这个数没被筛,就看看
{
j=i*2;//将原数扩大二倍初始化给j
do
{
prime[j]=1;//将j筛掉
j+=i; //再扩大一倍
}
while(j<=MAX);//直到最大
}
}
for(i=2; i<=MAX; i++)
{
if(prime[i]==0)//循环输出
cout<<i<<” “;
}
cout<<endl;
return 0;//主函数结束
}
【运行结果】
http://itlab.idcquan.com/Special/QT/Index.html