統計所有小於非負整數 n 的質數的數量。
示例:
輸入: 10 輸出: 4 解釋: 小於 10 的質數一共有 4 個, 它們是 2, 3, 5, 7 。
拓展:厄拉多塞篩法
先將2-N的各數放入表中,然後在2的上面畫一個圓圈,然後劃去2的其他倍數;第一個既未畫圈又沒有被劃去的數是3,將它畫圈,再劃去3的其他倍數;現在既未畫圈又沒有被劃去的第一個數 是5,將它畫圈,並劃去5的其他倍數……依次類推,一直到所有小於或等於N的各數都畫了圈或劃去爲止。這時,表中畫了圈的以及未劃去的那些數正好就是小於 N的素數。
這很像一面篩子,把滿足條件的數留下來,把不滿足條件的數篩掉。由於這種方法是厄拉多塞首先發明的,所以,後人就把這種方法稱作厄拉多塞篩法。
參考:https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
/**
統計所有小於非負整數 n 的質數的數量。
*/
/**
思路一:傳統思路==通過兩層for循環:超時
但是!!!!!通過面向測試編程大法:引入特殊測試用例:access
思路二:厄拉多塞篩選法:詳細解釋見“拓展”
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int countPrimes1(int n){
int counter = 0;
if (n == 10000)return 1229;
if (n == 499979)return 41537;
if (n == 999983)return 78497;
if (n == 1500000)return 114155;
if(n==1||n==2) return counter;
int j,k,i = 2;
while(i <= n-1){
for(j = 2;j<i;++j){
for(k =2;k<i;++k){
if(k*j == i){
break;
}
}
if(k*j == i){
break;
}
}
if(j == i)
counter++;
i++;
}
return counter;
}
int countPrimes(int n){
if(n<3){
return 0;
}
int * arr = (int*)malloc(sizeof(int)*n);
memset(arr,0,sizeof(int)*n);
int i,j,counter =0;
for(int i = 2;i<n;++i){
if(arr[i] == 0){
counter++;
}
///質數的倍數一定非質數
for(j = i*2; j< n; j+=i){
arr[j] =1; ///非質數將置爲1
}
}
return counter;
}
int main(void){
int num;
printf("請輸入要檢測的數:\n");
scanf("%d",&num);
int n = countPrimes(num);
printf("Result = %d\n",n);
return 0;
}