由toj「勇闖黃金十二宮 金牛宮」想到的

2021-04-06 22:44:36 字數 771 閱讀 5254

金牛宮是簡單的可以的一道入門題,只要嘗試從給出的整數裡摳出4個素數,成功的話就輸出niu!,否則輸出ruo..就可以幫助聖鬥士過關了.

問題出在資料規模上,題目給出的最大數字是2的31次方。在這個範圍內摳素數必須要預處理建立乙個素數表。

常用的求素數表的方法有兩種:

1   對於乙個整數n,用 2..它的平方根 除之,如果無法整除即證明它是個素數。用這個辦法判斷給定範圍內的每乙個整數是否為素數,把結果記下來就可以得到乙個素數表。對於較小的範圍這個演算法的時間還可以勉強接受,但金牛宮這個資料一定會超時。

2 篩法求素數,掏古人的腰包。用pascal實現起來非常舒服,建立乙個和範圍長度相同的一維布林陣列,每確定乙個素數以後把一她為約數的數字置為false就ok了。

對比兩種演算法誰都會堅定不移的選後者。(演算法藝術與資訊學競賽 裡lrj提到的那些求素數的演算法暫時不提)

可是,對於c語言怎麼樣呢?

c裡沒有辦法開布林陣列,而且我總覺得即使開也是一種浪費。於是我被逼無奈想出了這麼個把上面12結合起來的辦法:

對於乙個數n,除以 從2..小於n的最大素數組成的素數表 ,如果不能整除就把它加入該素數表。

說的再簡單點就是一邊求一邊用。在這個過程中實際上是把已經存在的素數的倍數給「篩掉」了。

實現起來非常簡單。

也許早就有人想到這個辦法了了吧,沒辦法,我比較遲鈍,生活就是這樣~~

後記:經趙育達大哥(不知道這樣稱呼他喜不喜歡……)指點終於相同,其實開個2的31次方的int陣列用篩法也未嘗不可,只是拿int存0和1跟pascal的布林比起來浪費那麼一點點……

勇闖黃金十二宮 金牛宮

勇闖 十二宮 金牛宮 time limit 1000ms memory limit 65536k total submit 20 accepted 3 description background 話說星矢 紫龍 冰河 阿瞬為了救活雅典娜,必須勇闖 十二宮。problem 第二個他們來到金牛宮,身為...

SSL 2666勇闖黃金十二宮射手宮

time limit 1000ms memory limit 65536k第九個他們來到射手宮,身為射手座 聖鬥士的艾爾里斯是獅子座聖鬥士艾爾里亞的哥哥,他早在13年前就發現了撒加殺了真教皇,並且自己做了假教皇。然而他卻被撒加 致死。現在星矢四人已經來到了射手宮。艾爾里斯的靈魂想考驗一下這些聖鬥士們...

SSL 2666 勇闖黃金十二宮射手宮

第九個他們來到射手宮,身為射手座 聖鬥士的艾爾里斯是獅子座聖鬥士艾爾里亞的哥哥,他早在13年前就發現了撒加殺了真教皇,並且自己做了假教皇。然而他卻被撒加 致死。現在星矢四人已經來到了射手宮。艾爾里斯的靈魂想考驗一下這些聖鬥士們的水平,在射手宮的牆上留下了一道題目。已知艾爾里斯和弟弟艾爾里亞的基因基本...