求质数(素数)的方法

质数是数学重要的一环,所谓质数,就是除了1和它本身外不存在任何因子的数。以下整理了一下c语言中质数的求法。

问题:输入一个正整数n(n>=2),求不大于n的全部质数

方法一:循环法

思路:判断一个数n是不是质数,可以用2到√n之间的所有整数去除n,如果都不能整除,那么n是质数。设计循环嵌套时尽量跳过一些不必要的情况。

1."2"为必输出的质数,可以单独输出。这样循环可从3到√n判断。

2.为什么只需要判断到√n的数呢?

    因为n=√n*√n,n的因数除了√n,其他都是成对存在的,且必定一个大于√n一个小于√n,假设n不是质数,有个因数大于√n(不是n本身),则n必定有一个与之对应的小于√n的因数。

3.除了2以外,不存在是偶数的质数,所以在设计循环时可以设置步数step为2。

代码:

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int m,n;
 5     scanf("%d",&n);
 6     printf("2\n");
 7     for(int i=3;i<=n;i+=2)
 8     {
 9         for(m=3;m<i;m+=2)
10         {
11             if(i%m==0 || m*m>i)
12                 break;
13         }
14         if(m*m>i)
15             printf("%d\n",i);
16     }
17 
18     return 0;
19 }

 

输入:100

运行结果:

方法二:筛法(空间换时间)

思路:把2到n中的所有数都列出来,然后从2开始,先筛去n内所有2的倍数,然后每次从下一个剩下的数(必然为质数)开始,筛去其n内所有的倍数,最后剩下的数都是质数。

1.设置一个数组a[],a[i]的值为1表示i为质数,将所有元素初始化为1

2.筛去m的倍数,即把a[2*m]、a[3*m]…置为0

3.输出a[i]值为1的i。

代码:

 1 #include<stdio.h>
 2 #define MAX 100
 3 int s;
 4 int a[MAX];
 5 void prime()
 6 {
 7     s=1;
 8     for(int i=0;i<=MAX;i++)
 9         a[i]=1;
10     a[0]=a[1]=0;
11     for(int i=2;i<=MAX;i++)
12     {
13         if(a[i])
14             a[s++]=i;
15         for(int j=i*2;j<=MAX;j+=i)
16             a[j]=0;
17     }
18 }
19 int main()
20 {
21     prime();
22     for(int i=1;i<s;i++)
23         printf("%d\n",a[i]);
24     return 0;
25 }

MAX设置值:100

运行结果:

 

可以看出,两种方法都成功得到了结果。

 

posted @ 2018-08-22 14:35  望三星  阅读(15983)  评论(1编辑  收藏  举报