1、两种算法
方法一:筛选法
用计算机求素数是利用素数的定义:除了1和自己本身没有因子,或者说无法被大于1小于自身的数整除。当然这样就足以解决问题了。得到两个推论:
1、2是最小的素数。
2、所有大于2的素数都是奇数。
这个推论可以把工作量减少一半,有些问题这就足够了,但是最重要的是我们从推论里得到一个方法:筛选法。
你给定一个范围(求这个范围内的素数),进行如下步骤:
0、从2开始,2是第一个素数,也是第一个新素数,取出2。
1、筛掉所有新素数的倍数。
2、留下来的数里面第一个(最小的)是新素数,取出这个新素数。
3、重复1、2,直到没有数存在。
程序如下:
#include "stdio.h"
#include "time.h"
#include "stdlib.h"
#define true 1
#define false 0
#define N 120
void shushu(int a)
{
int b[N][2],j=2,sum=0;
int is=true,count=0;
for(int i=1;i<=a;i++)
{
b[i][0]=i;
b[i][1]=true;
}//for
b[1][1]=false;
while(is)
{
for(int i=2;i<=a/j; i++)
{
b[j*i][1]=false;
}//for
for(int k=j+1;k<a;k++){
if(b[k][1]==true)
{
j=k;
is=true;
break;
}//if
is=false; }//for
}//while
//下面是求和及输出
for(int m=1;m<=a;m++)
if(b[m][1]==true)
{
sum+=b[m][0];
printf("%d\n",b[m][0]);
}
printf("%d\n",sum);
sum=0;
}
int main()
{
shushu(100);
return 0;
}
方法二:传统算法
判明素数,设整数m
1、m是素数的条件是看它能不能被2,3,,,m-1整除,根据这个写个循环算法,
2、如果m不是素数,可表示为:m=i*j,i<=j,i<=m的二次根,j>=m的二次根;也就是说,对于一个不是素数的数来说,如果他不能被小于二次根号该数的数年整除,他也一定不能被大于二次根号的数整除。
所以可以把上面的算法优化成循环在2到m的二次方根里进行。
程序如下:
void shushu(int a) //a是需要判断的数
{
for(int b=2;b<=sqrt(a);b++)
{
if(a%b==0) {cout<<"不是"; break;}
} //for
}
2、第一种方法是新思维。应当说,新思维在时间复杂度上比传统算法小,但是空间复杂度大了。