与素数有关的程序

来源:互联网 发布:python interfaceerror 编辑:程序博客网 时间:2024/04/29 19:59
(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;   }