#10136: 我的解法OwO(給大家參考一下)


Thebigbang (喜憨外星人)

學校 : 國立臺中第一高級中學
編號 : 32618
來源 : [61.219.170.5]
最後登入時間 :
2020-07-29 20:12:21
a007. 判斷質數 | From: [219.85.9.149] | 發表日期 : 2015-08-14 18:41

這題以前很溫和的...

我用了兩種解法(給大家參考一下)

一.埃拉托斯特尼篩法

這篩法我就不贅述了(自己Google)

重點是題目的測資x的範圍長這樣:2<=x<=2147483647

如果開一個陣列來篩->bool Prime[2147483648];

編譯器就會告訴你:不好意思...先生...你太大了= =

所以我們就只能篩小一點了

我們篩sqrt(2147483647)以下的就好了 註:sqrt是根號

因為我們知道 要檢驗N是不是質數的話

我們只要把N一一除以 小於sqrt(N)的質數 就可以知道他是不是質數了

簡單來說就是(假設測資是N):

1.得到sqrt(2147483647)以下的所有質數->這步驟很快的

2.再把N一一除以我們上面的到的質數

3.恩...就這樣...1.4s喔

二.費馬小定理

費馬小定理也自己Google一下(不會很難理解喔XD)

不贅述了...

簡單來說就是(假設測資是N):

1.得到sqrt(2147483647)以下的所有質數->跟剛剛一樣

2.找出跟N互質的M->用第一步的質數一個一個找(也就是第一個 N%某質數 != 0)

3.看看M^N-1(mod N)等不等於1(等於就可能是質數 不等於就一定不是質數) 註:請用快速冪XD

4.只有第41526筆測資是偽質數(Carmichael Numbers)也就是它等於1但不是質數->這時候就手動輸出ㄅXD(也就是自己放個計數器)

5.恩...就這樣 ...0.7s喔(Yeah~)

 
#10199: Re:我的解法OwO(給大家參考一下)


Thebigbang (喜憨外星人)

學校 : 國立臺中第一高級中學
編號 : 32618
來源 : [61.219.170.5]
最後登入時間 :
2020-07-29 20:12:21
a007. 判斷質數 | From: [219.84.184.94] | 發表日期 : 2015-09-01 08:59

大家不要笑我...

我剛剛才發現原來scanf和printf比cin和cout快很多的說...

原來以為cin和cout不用打括弧很棒~

結果...

所以我改成scanf和printf重測後:

1.埃拉托斯特尼篩法:1.0s

2.費馬小定理:0.3s

 
ZeroJudge Forum