leet204. 計數質數

統計所有小於非負整數 的質數的數量。

示例:

輸入: 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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章