1. 程式人生 > >1098 素數個數

1098 素數個數

素數個數

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;
}

要一直對大可愛寵愛有佳~

在這裡插入圖片描述