质数:质数(prime number)又称素数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为质数。
题设:输入一个大于1的自然数,求出从2到该数之间所有的质数。
1. 按照素数的定义来求取,用两个for循环。
1 #include <stdio.h> 2 int prime(int i){ 3 int j; 4 for(j=2;j<i;j++){ 5 if(i%j==0){ 6 return 0; 7 } 8 } 9 return 1; 10 11 } 12 13 int main(void){ 14 int n,i; 15 printf("请输入一个整数: "); 16 scanf("%d",&n); 17 for(i = 2; i <= n; i++){ 18 if(prime(i)){ 19 printf("%d ",i); 20 } 21 } 22 printf(" "); 23 24 }
2. 对 1 进行优化,先排除可以被2整除的数(一定不是质数),sqrt()减少循环的区间。
1 #include <stdio.h> 2 #include <math.h> 3 int prime(int i){ 4 int j,temp; 5 temp=sqrt(i)+1;//sqrt() 6 for(j=2;j<temp;j++){ 7 if(i%j==0){ 8 return 0; 9 } 10 } 11 return 1; 12 } 13 int main(void){ 14 int n,i; 15 printf("请输入一个整数: "); 16 scanf("%d",&n); 17 for(i = 2; i <= n; i++){ 18 if(i % 2 != 0){ //除去2的倍数。 19 if (prime(i)) { 20 printf("%d ",i); 21 } 22 } 23 24 } 25 printf(" "); 26 27 }
3. 筛选法
1 #include "stdio.h" 2 #include "math.h" 3 int main(void){ 4 int i,j,n,t,a[10000]; 5 t = 0; 6 for(i = 0; i < 10000; i++){ 7 a[i] = 1; 8 } 9 10 printf("请输入一个大于1的整数: "); 11 scanf("%d",&n); 12 13 for(i = 2; i <= n; i++){ 14 if(a[i] == 1){ 15 for(j = i*2; j <= n; j = j+i){ 16 a[j] = 0; 17 } 18 printf("%d ",i); 19 t++; 20 } 21 } 22 printf(" "); 23 printf("%d",t); 24 25 26 }
3-1 筛选法优化
1 #include <stdio.h> 2 #include <math.h> 3 4 int main(){ 5 int arr[1000], i, j, n; 6 arr[2] = 1; 7 for(i=3; i<1000; i++){ 8 if(i % 2==0){ 9 arr[i] = 0; 10 }else{ 11 arr[i] = 1; 12 } 13 } 14 15 printf("请输入一个整数: "); 16 scanf( "%d", &n); 17 18 for(i=2; i<=n; i++){ 19 if (arr[i] == 1){ 20 for(j=i*i; j<=n; j=j+i*2){ 21 arr[j] = 0; 22 } 23 24 printf("%d ",i); 25 } 26 27 } 28 29 30 }