(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;
}