与素数有关的程序

(1)判断单个数是否是素数
/*    
 * Copyright (c) 2012, 烟台大学计算机学院     
 * All rights reserved.     
 * 作    者:郭艳燕   
 * 专业班级:软件工程 
 * 完成日期:2012 年 11 月 9 日     
 * 版 本 号:v1.0     
 * 输入描述:一个整数    
 * 问题描述:判断从键盘输入的一个数是否是素数 
 * 程序输出: 该整数是否为素数      
 * 问题分析:素数是除1和自己无因子的数 ,如果m不能够除尽2~m-1中的任何一个数则为素数
             改进:如果m不能够除尽2~m的平方根中的任何一个数则为素数
 * 算法设计:用循环实现    
 */    

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main( )
{int  m,k,i;
 bool  prime;      //定义布尔变量prime
 prime=true;   //循环开始时设prime为真,即先认为m为素数
 cout<<"请输入一个整数:";
 cin>>m;        //输入m的值
 k=int(sqrt(m));          //用k代表根号m的整数部分
 for(i=2;i<=k;i++)       //检查是否能整除2~根号m
    if(m%i==0)             //如果能整除,表示m不是素数
 { prime=false;       //使prime变为假
   break;             //终止执行本循环
 }
 if (prime)  cout<<m<<"是素数"<<endl;//如果m为素数, 输出m是素数
 else     cout<<m<<"不是素数"<<endl; //否则,输出m不是素数  
 return 0;
}




(2)输出一定范围内的素数

/*     
 * Copyright (c) 2012, 烟台大学计算机学院      
 * All rights reserved.      
 * 作    者:郭艳燕    
 * 专业班级:软件工程  
 * 完成日期:2012 年 11 月 12 日      
 * 版 本 号:v1.0      
 * 输入描述:无     
 * 问题描述:输出100~200间的全部素数
 * 程序输出:输出100~200间的全部素数   
 * 问题分析:1. 判断一个数是否是素数 (素数是除1和自己无因子的数 ,如果m不能够除尽2~m-1中的任何一个数则为素数 
             改进:如果m不能够除尽2~m的平方根中的任何一个数则为素数 )
			 2.判断一个范围内的素数
 * 算法设计:用双重循环,外循环控制m的变化(100~200),内循环判断当前外循环控制变量m是否是素数
 */      
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main( )
{int m, k, i, n=0;
 bool prime;    
  //定义布尔变量prime
 for(m=101;m<=200;m=m+2)   //外循环 
  //判别m是否为素数,m由101变化到200,增量为2
 { prime=true; //循环开始时设prime为真,即先认为m为素数 
   k=int(sqrt(m));         
 //用k代表根号m的整数部分
   for(i=2; i<=k; i++)        //内循环作用是将m被2~根号m除,检查是否能整除
    if(m%i==0)//如果能整除,表示m不是素数
     { prime=false;      //使prime变为假
        break;             //终止执行本循环
     } 
   if (prime)           //如果m为素数
     {  cout<<setw(5)<<m; 
        n=n+1;      //n累计素数的个数  
     }
   if(n%10==0) cout<<endl;  
                  //输出10个数后换行
  }
   cout<<endl;      //最后执行一次换行
   return 0;
}




(3)循环输入一个数,判断其是否是素数

/*    
 * Copyright (c) 2012, 烟台大学计算机学院     
 * All rights reserved.     
 * 作    者:郭艳燕   
 * 专业班级:软件工程 
 * 完成日期:2012 年 11 月 9 日     
 * 版 本 号:v1.0     
 * 输入描述:循环从键盘输入整数,直到输入为0    
 * 问题描述:从键盘上循环输入一个数,判断是否是素数,直到输入的数为0则退出程序
 * 程序输出: 循环输出从键盘上输入的整数是否为素数      
 * 问题分析:1、一个数是否是素数的方法是除1和自己无因子的数 ,如果m不能够除尽2~m-1中的任何一个数则为素数
             改进:如果m不能够除尽2~m的平方根中的任何一个数则为素数
			 2、循环输入,直到输入的数是0退出程序
 * 算法设计:用双重循循环实现
             外循环控制循环输入一个数,判断是否是0,不是0则进入内循环判断是否是素数
			 内循环判断输入的数是否素数
 */    

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main( )
{int  m,k,i;
 bool  prime;      //定义布尔变量prime
 cout<<"请输入一个整数(0退出程序)";
 cin>>m;        //输入m的值
 while(m!=0)
 {
   prime=true;   //循环开始时设prime为真,即先认为m为素数
   k=int(sqrt(m));          //用k代表根号m的整数部分
   for(i=2;i<=k;i++)       //检查是否能整除2~根号m
     if(m%i==0)             //如果能整除,表示m不是素数
	 { prime=false;       //使prime变为假
       break;             //终止执行本循环
	 }
   if (prime)  cout<<m<<"是素数"<<endl;//如果m为素数, 输出m是素数
     else   cout<<m<<"不是素数"<<endl; //否则,输出m不是素数  
   cout<<"请输入一个整数,输入为0退出程序";
   cin>>m;
 }
 return 0;
}


(4)建立一个判断素数的函数,用ture或false作为返回值。主程序中调用该函数来判断从键盘中输入的数是否是素数。

/*     
 * Copyright (c) 2012, 烟台大学计算机学院      
 * All rights reserved.      
 * 作    者:郭艳燕    
 * 专业班级:软件工程  
 * 完成日期:2012 年 11 月 9 日      
 * 版 本 号:v1.0      
 * 输入描述:一个整数     
 * 问题描述:判断从键盘输入的一个数是否是素数,通过函数调用实现  
 * 程序输出: 该整数是否为素数       
 * 问题分析:素数是除1和自己无因子的数 ,如果m不能够除尽2~m-1中的任何一个数则为素数 
             改进:如果m不能够除尽2~m的平方根中的任何一个数则为素数
			 把判断过程写入函数,函数的参数为被判断的数,函数的返回值如果是素数返回ture,如果不是素数返回false
 * 算法设计:用函数实现     
 */      
  
#include <iostream>   
#include <cmath>   
#include <iomanip>   
using namespace std;  
bool IsPrimer(int x); //函数声明
int main( )  
{int  m;  
 cout<<"请输入一个整数:";  
 cin>>m;        //输入m的值   
 if (IsPrimer(m))  cout<<m<<"是素数"<<endl;//如果m为素数, 输出m是素数   
 else     cout<<m<<"不是素数"<<endl; //否则,输出m不是素数     
 return 0;  
}  

bool IsPrimer(int x) //判断x是否是素数的函数,是返回ture,否返回false
{
  int k;
  int i;
  bool  prime=true;      //定义布尔变量prime,循环开始时设prime为真,即先认为m为素数 
  k=int(sqrt(x));          //用k代表根号m的整数部分   
  for(i=2;i<=k;i++)       //检查是否能整除2~根号m   
    if(x%i==0)             //如果能整除,表示m不是素数   
	{ prime=false;       //使prime变为假   
      break;             //终止执行本循环   
	}   
   return prime;
}


 

(5)输出一定范围内的素数,通过调用函数的方式实现
 
 
/*     
 * Copyright (c) 2012, 烟台大学计算机学院      
 * All rights reserved.      
 * 作    者:郭艳燕    
 * 专业班级:软件工程  
 * 完成日期:2012 年 11 月 9 日      
 * 版 本 号:v1.0      
 * 输入描述:无     
 * 问题描述:判断一个数是否是素数,通过函数调用实现,输出100~200内的素数  
 * 程序输出:100~200内的素数       
 * 问题分析:素数是除1和自己无因子的数 ,如果m不能够除尽2~m-1中的任何一个数则为素数 
             改进:如果m不能够除尽2~m的平方根中的任何一个数则为素数
			 把判断过程写入函数,函数的参数为被判断的数,函数的返回值如果是素数返回ture,如果不是素数返回false
 * 算法设计:循环调用函数,循环控制变量从100变化到200,对每一个数调用函数来进行判断    
 */      
  
#include <iostream>   
#include <cmath>   
#include <iomanip>   
using namespace std;  
bool IsPrimer(int x); //函数声明
int main( )  
{int  m;  
 int  n=0; //记录素数个数
 for(m=101;m<200;m=m+2)   
   if (IsPrimer(m)) 
   {cout<<m<<" ";//如果m为素数, 输出m
    n++;
	if(n%10==0)
	  cout<<endl;
   }
 return 0;  
}  

bool IsPrimer(int x) //判断x是否是素数的函数,是返回ture,否返回false
{
  int k;
  int i;
  bool  prime=true;      //定义布尔变量prime,循环开始时设prime为真,即先认为m为素数 
  k=int(sqrt(x));          //用k代表根号m的整数部分   
  for(i=2;i<=k;i++)       //检查是否能整除2~根号m   
    if(x%i==0)             //如果能整除,表示m不是素数   
	{ prime=false;       //使prime变为假   
      break;             //终止执行本循环   
	}   
   return prime;
}

 

(6)循环输入一个数,判断其是否是素数,用函数调用的方式实现

 

/*     
 * Copyright (c) 2012, 烟台大学计算机学院      
 * All rights reserved.      
 * 作    者:郭艳燕    
 * 专业班级:软件工程  
 * 完成日期:2012 年 11 月 9 日      
 * 版 本 号:v1.0      
 * 输入描述:循环从键盘输入整数,直到输入为0     
 * 问题描述:从键盘上循环输入一个数,判断是否是素数,直到输入的数为0则退出程序 
 * 程序输出: 循环输出从键盘上输入的整数是否为素数       
 * 问题分析:1、一个数是否是素数的方法是除1和自己无因子的数 ,如果m不能够除尽2~m-1中的任何一个数则为素数 
             改进:如果m不能够除尽2~m的平方根中的任何一个数则为素数 ,用函数调用的方式进行素数判断
             2、循环输入,直到输入的数是0退出程序 
 * 算法设计:用循环调用判断素数的函数实现 
             循环控制循环输入一个数,判断是否是0,不是0则进入内循环判断是否是素数 
            
 */      
  
#include <iostream>   
#include <cmath>   
#include <iomanip>   
using namespace std;  
bool IsPrimer(int x);
int main( )  
{int  m;  
 cout<<"请输入一个整数(0退出程序)";  
 cin>>m;        //输入m的值   
 while(m!=0)  
 {   
   if (IsPrimer(m))  cout<<m<<"是素数"<<endl;//如果m为素数, 输出m是素数   
     else   cout<<m<<"不是素数"<<endl; //否则,输出m不是素数     
   cout<<"请输入一个整数,输入为0退出程序";  
   cin>>m;  
 }  
 return 0;  
}  

bool IsPrimer(int x) //判断x是否是素数的函数,是返回ture,否返回false   
{  
  int k;  
  int i;  
  bool  prime=true;      //定义布尔变量prime,循环开始时设prime为真,即先认为m为素数    
  k=int(sqrt(x));          //用k代表根号m的整数部分      
  for(i=2;i<=k;i++)       //检查是否能整除2~根号m      
    if(x%i==0)             //如果能整除,表示m不是素数      
    { prime=false;       //使prime变为假      
      break;             //终止执行本循环      
    }     
   return prime;  
}  

(7)验证哥德巴赫猜想
/*     
 * Copyright (c) 2012, 烟台大学计算机学院      
 * All rights reserved.      
 * 作    者:郭艳燕    
 * 专业班级:软件工程  
 * 完成日期:2012 年 11 月 12 日      
 * 版 本 号:v1.0      
 * 输入描述:  不小于6的偶数n
 * 问题描述:  验证哥德巴赫猜想
 * 程序输出:  不小于6的偶数x=a+b ,a和b是素数
 * 问题分析:一个不小于6的偶数可以表示为两个素数之和。如6=3+3,8=3+5,10=3+7,。。。
   在主程序中输入一个不小于6的偶数x,然后调用函数gotbaha,在gotbaha函数中再调用IsPrime函数,
 * 算法设计: IsPrime函数的作用是判断一个数是否是素数,参数是要被判断的素数  
              在gotbaha函数中输出以下形式的结果:34=3+31(3和31都是素数)
 */      
#include <iostream>
#include <cmath>
using namespace std;
bool IsPrimer(int x) ;
void godbaha(int x);


int main()
{
int n;
cout<<"请输入您想验证的数:";
cin>>n;
cout<<"输出验证结果:"<<endl;
godbaha(n);//调用godbaha函数,输出满足要求的组合
return 0;
}


void godbaha(int x)  //选出满足 x=a+b ,a和b是素数 的组合
{
 int a,b;
 for(a=3;a<x/2;a=a+2) //这样可以保证a<b
 {
   if(IsPrimer(a)) //a是素数
   {
     b=x-a;
	 if(IsPrimer(b)) //b是素数
	 {
	   cout<<x<<"="<<a<<"+"<<b<<endl; //满足x=a+b,a和b都是素数
	 }
   }
  
 }

}


bool IsPrimer(int x) //判断x是否是素数的函数,是返回ture,否返回false   
{  
  int k;  
  int i;  
  bool  prime=true;      //定义布尔变量prime,循环开始时设prime为真,即先认为m为素数    
  k=int(sqrt(x));          //用k代表根号m的整数部分      
  for(i=2;i<=k;i++)       //检查是否能整除2~根号m      
    if(x%i==0)             //如果能整除,表示m不是素数      
    { prime=false;       //使prime变为假      
      break;             //终止执行本循环      
    }     
   return prime;  
}  


 
(8)用筛选法求100以内的素数----利用数组
/*
用筛选法求100以内的素数
所谓“筛选法”指的是“埃拉托色尼(Eratosthenes)筛法”。他是古希腊的著名数学家。他采取的方法是,在一张纸上写上1到100全部整数,然后逐个判断它们是否是素数,找出一个非素数,就把它挖掉,最后剩下的就是素数。

具体做法如下:
<1> 先将1挖掉(因为1不是素数)。
<2> 用2去除它后面的各个数,把能被2整除的数挖掉,即把2的倍数挖掉。
<3> 用3去除它后面的各数,把3的倍数挖掉。
<4> 分别用4、5…各数作为除数去除这些数以后的各数。这个过程一直进行到在除数后面的数已全被挖掉为止。例如找1~50的素数,要一直进行到除数为47为止(事实上,可以简化,如果需要找1~n范围内素数表,只需进行到除数为n^2(根号n),取其整数即可。例如对1~50,只需进行到将50^2作为除数即可。)

如上算法可表示为:
<1> 挖去1;
<2> 用刚才被挖去的数的下一个数p去除p后面各数,把p的倍数挖掉;
<3> 检查p是否小于n^2的整数部分(如果n=1000, 则检查p<31?),如果是,则返回(2)继续执行,否则就结束;
<4> 纸上剩下的数就是素数。


定义1个数组a, a[1]~a[100] 分别代表1~100这100个数。
如果检查出数组a的某一元素的值不是素数,就将其值设为0,最后剩下不为0的就是素数。

*/

#include <iostream>
#include <iomanip>
using namespace std;
#include <math.h>
int main()
 {int i,j,n,a[101]; //定义a数组包含101个元素
  for (i=1;i<=100;i++) //a[0]不用,只用a[1]~a[100]
    a[i]=i; //使a[1]~a[100]得值分别为1~100
  a[1]=0;   //先“挖掉”a[1]
  for (i=2;i<sqrt(100);i++)  //i表示被除数下标,从2~sqrt(n) n=100
    for (j=i+1;j<=100;j++)  //j表示除数下标,从i后面的i+1到100
       {if(a[i]!=0 && a[j]!=0)  
	      if (a[j]%a[i]==0)  //如果整除,表示a[j]不是素数,则挖掉它
			  a[j]=0;  }        
    cout<<endl;
    for (i=1,n=0;i<=100;i++)  
     {if (a[i]!=0)   //没有被挖掉的数,即值不为0的数,为素数
       {cout<<setw(5)<<a[i]<<" ";
	    n++;}  //累计素数个数      
      if(n==10) //输出10个数后换行
        {cout<<endl;
   	     n=0;}
     }
	cout<<endl;
	return 0;
   } 


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值