昨天天烆問我ZeroJudge上的質數問題要怎麼解,說真的,我不會XD
兩個人只好直接拜見Google大神,也找到了一個自己也不知道為什麼但卻通過的程式碼(汗
於是今天就去問數學老師關於質數檢查的問題,他表示這基本上還是要一個一個去檢查,但有個比較快的方法,就是只檢查到原數開根號的數字
接下來就是回家實作的時間~~
大概花了兩小時就完成了,執行檔可以在這裡下載
但要記得裝VC++2010函式庫:https://atifans.net/download/code/prime_number_checker.rar
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | //存取所需函式 #include <stdio.h> #include <math.h> //主程式 int main( void ){ //定義變數 int test,input,checked; float input_sqrt; printf ( "這支程式用來檢測一個數字是否為質數,可輸入-1來退出程式\n\n" ); while (1){ printf ( "要檢查的數字:" ); scanf_s( "%d" , &input); if (input == EOF) //檢查輸入數字的有效性 break ; if (input == 2){ printf ( "結果:質數\n\n" ); } else if (input == 1){ printf ( "結果:這是1\n\n" ); } else if ((input % 2) == 0){ printf ( "結果:非質數,最小因數為2\n\n" ); } else { checked = 0; input_sqrt = sqrt (( float )input); for (test = 3; test <= input_sqrt; test += 2){ if ((input % test) == 0){ printf ( "結果:非質數,最小因數為%d\n\n" , test); checked = 1; break ; } } if (checked != 1) printf ( "結果:質數\n\n" ); } } return 0; } |
還有一個更快的方法就是用質數表下去除了
@kgame
在(2^31)-1的情況下當然是可行啦... {= =|||}
想想看大於(2^31)-1 ,甚至大於2^64的整數問題如何解
@kgame
據說(?)是用array {|||}
最近都習慣用篩法來做
超過64位元整數範圍的數值 只要建立好大數的系統應該也能使用相同的方法吧
不知道是否有效率更高的作法就是了A_A
@NiwaSho Lin
聽起來好像很複雜 {||||}
這個程式有 bug ,它會把 1 當成質數。
感謝告知,當時沒注意到XD