求质数(素数)的方法
质数是数学重要的一环,所谓质数,就是除了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
运行结果:
可以看出,两种方法都成功得到了结果。