1098 素數個數
阿新 • • 發佈:2018-12-12
素數個數
1、題目內容
Description 給定兩個非負整數a,b,其中0<= a,b<=1,000,000,請計算這兩個數之間有多少個素數。
輸入 第一行是一個整數K(1<=K<=1000),表示有多少個樣例,每個樣例佔一行,是兩個整數a和b,每個整數之間用一個空格隔開。
輸出 每行輸出一個樣例的結果。
Sample Input 2 2 3 17 19
Sample Output 2 2
2、題目分析
這個題,該是見證了多少學子的心酸,因為,這個題要通過的話,只有唯一的一種方法——打表法,除此以外,沒見過用其它方法過掉這個題的。所謂打表法,其實就可以理解為標記法,我們通過使用素數存在的規律,將範圍內所有的數都做個標記,素數標記為1,不是素數的話咧,我們就標記為0。素數存在的規律是這樣的:如果a為素數,那麼2a,3a,4a…就都不是素數了。比如哈:2是素數吧,但是4,6,8,10…就都不是素數了。根據這個規律進行打表,就可以解決了。
3、參考程式碼
#include<stdio.h> int num[1000001];//陣列的定義必須放在這,因為它的下標過大,所需記憶體過多,所以,定義為全域性的陣列 int main() { int i,j,k; for(i=2;i<1000001;i++) //賦初始值為1 { num[i]=1; } for(i=2;i<500001;i++) //開始打表 { if(num[i]) //判斷這個數是不是素數,是的話就可以使用那個規律進行打表了 { for(j=i+i;j<1000001;j+=i) //打表 { num[j]=0; } } } scanf("%d",&k); while(k--) { int count=0; int a,b,t; scanf("%d %d",&a,&b); if(a>b) //很容易忽略這個小細節,題目可沒說a一定會小於b,所以得考慮到這個情況 { t=a; a=b; b=t; } for(i=a;i<=b;i++) //區間搜尋計數啦,找出素數個數 { if(num[i]) count++; } printf("%d\n",count); } return 0; }