3、求素数的传统算法和新思维

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、第一种方法是新思维。应当说,新思维在时间复杂度上比传统算法小,但是空间复杂度大了。

发布了288 篇原创文章 · 获赞 31 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/hopegrace/article/details/104589029