具體篩法是:先把n個自然數按次序排列起來。1不是質數,也不是合數,要划去。第二個數2是質數留下來,而把2后面所有能被2整除的數都划去。2后面第一個沒划去的數是3,把3留下,再把3后面所有能被3整除的數都划去。3后面第一個沒划去的數是5,把5留下,再把5后面所有能被5整除的數都划去。這樣一直做下去,就會把不超過N的全部合數都篩掉,留下的就是不超過N的全部質數。因為希臘人是把數寫在塗臘的板上,每要划去一個數,就在上面記以小點,尋求質數的工作完畢后,這許多小點就像一個篩子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼篩法”,簡稱“篩法”。
下面是代碼:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <strings.h> 5 int main(int argc, char * argv[]) 6 {
//尋找2~num之間的所有素數 7 if(argc < 2) 8 { 9 printf("Usage : %s num\n", argv[0]); 10 return 0; 11 } 12 int iMax = atoi(argv[1]); 13 14 if(iMax < 2) 15 { 16 printf("num is too little, num >=2"); 17 return 0; 18 } 19 20 char *p = (char *)malloc(sizeof(char) * iMax + 1); 21 bzero(p, sizeof(char) * iMax + 1); 22 23 int i = 0, j = 0, k = 0; 24 for(i = 2; i <= iMax; i++) 25 { 26 for(j = i + i; j <= iMax; j += i) 27 { 28 p[j] = 1; 29 } 30 } 31 FILE * fp = NULL;
//程序執行完成后,文件 prime-number.txt中就是我們需要的素數 32 if((fp = fopen("prime-number.txt", "w")) == NULL) 33 { 34 return 0; 35 } 36 k = 0; 37 int iAll = 0; 38 for(i = 2; i <= iMax; i++) 39 { 40 if(0 == p[i]) 41 { 42 iAll ++; 43 k++; 44 // output to file : fp,把這些素數寫入文件 45 fprintf(fp, "%6d ", i); 46 if(10 == k) 47 { 48 fprintf(fp, "\n"); 49 k = 0; 50 } 51 //printf("%d ", i); 52 } 53 } 54 printf("\n"); 55 fclose(fp); 56 free(p); 57 printf("all : %d\n", iAll); 58 59 return 0; 60 }
輸出結果放在百度網盤 :http://pan.baidu.com/s/1pJv58Wb
作者:風波
mail : fengbohello@qq.com