題目**:
#include
#include
int prime[700000];
bool check[10000000];
int num = 1;
int judge(int
y) int j = 0;
while(p[j] != -1)
j++;
j--;
i = 0;
while (i <= j)
i++,j--;
}return1;}
int main()
int j = 1;
for ( ; j < num; j++)
check[prime[j]*i] = 1;
if(i % prime[j] == 0)
break;}}
int a,b;
while (~scanf("%d
%d", &a, &b))
}for (i = j; prime[i] <= b && i < num; i++)
}printf("\n");
}return
0;}
用prime來儲存素數,但如何確定小於x範圍內素數的大致個數?最簡單的公式為x/lnx。但算出的結果是不準確的,大於有百分之幾的誤差,x越大時誤差越小。
用check陣列來標記所有數,初始化為0,若發現下標是合數,空間內放1;
陣列的型別可以定義為bool型別,這道題裡如果是int型,空間會超,而bool型別會省很多空間,因為在32位平台c/c++,int為4位元組,而bool為1位元組(c語言沒有bool型別,需要引標頭檔案,c++有,無需引標頭檔案,但無論c還是c++,大小都是1位元組)。
題目給出的範圍是1-100000000,但計算時看了下結果,10000000-99999999範圍內沒有符合的數,所以我們可以將範圍縮小為原來的十分之一(可能會有別的更好地處理方法)。
素數篩法的中心模組在於以下**:
int i = 2;
for ( ; i < 10000000; i++)
// 無論這個數是否為素數,都將它一定範圍內的倍數試除
int j = 1;
// j小於等於已有素數的下標(由於前面為num自增,所以這裡不需要等號)
for ( ; j < num; j++)
check[prime[j]*i] = 1;
if(i % prime[j] == 0) // 這一句很關鍵,解析較長寫下面
break;
}}
素數回文
xiaoou33對既是素數又是回文的數特別感興趣。比如說151既是素數又是個回文。現在xiaoou333想要你幫助他找出某個範圍內的素數回文數,請你寫個程式找出 a 跟b 之間滿足條件的數。(5 <= a < b <= 100,000,000);
input
這裡有許多組資料,每組包括兩組資料a跟b。
output
對每一組資料,按從小到大輸出a,b之間所有滿足條件的素數回文數(包括a跟b)每組資料之後空一行。
sample input
5 500
sample output
5 7
11 101
131
151
181
191
313
353
373
383
素數篩法打表
篩法打素數表是一種高效的打表方法,具體做法是 先把n個自然數按次序排列起來。1不是質數,也不是合數,要划去。第二個數2是質數留下來,而把2後面所有能被2整除的數都劃去。2後面第乙個沒劃去的數是3,把3留下,再把3後面所有能被3整除的數都劃去。3後面第乙個沒劃去的數是5,把5留下,再把5後面所有能被5...
素數打表 篩法
打表 是一種典型的用空間換時間的做法,一般指將所有可能需要用到的結果事先計算出來,這樣以後後面需要用到時就可以直接查表獲得。在什麼情況下我們需要打表?1 在程式中一次性計算出所有需要用到的結果,之後查詢直接取這些結果。舉個例子,假如我們算fibonacci數中的f n 我們假如需要算很多次q次 比如...
素數篩法(素數篩 線性篩)
求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...