Zerojudge 基礎題庫a010 因數分解
我很討厭因式分解,國中的時候找那些超大的質數真是累死人了。
這題我想到的架構如下:
1.輸入整數 (>1,<1000000)
2.找出質因數式子
3.把結果弄成字串
4.輸出答案
至於如何找出質因數式子(我忘記他叫甚麼了)?
我想先找出所有1000000以內的質數
每找到一個,直接測試(把它拿去當除式)
假設我要找20的質因數式子:
2可不可以整除20? Yes
-> 20/2
記住我除了一次
2可不可以整除10? Yes
-> 10/2
記住我除了兩次
2可不可以整除5? No
-> 輸出"2"
我除的次數是不是比一還多? Yes
-> 輸出"^"+除的次數
5等於一嗎? No
-> 輸出" * "
3可不可以整除5? No
4 可不可以整除5? No
5可不可以整除5? Yes
-> 5/5
記住我除了一次
5可不可以整除1? No
->輸出"5"
我除的次數是不是比一還多? No
-> 不輸出
1等於一嗎? Yes
-> 停止程式
...
好,我們轉換一下:
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | n = 20 n % 2 == 0? Yes n = n/2 counter++ n % 2 == 0? Yes n = n/2 counter++ n % 2 == 0? No cout << "2"; counter > 1? Yes cout << "^" << counter counter = 0 n == 1? No cout << " * "; n % 3 == 0? No none n % 4 == 0? No none n % 5 == 0? Yes n = n/5 counter++ n % 5 == 0? No cout << "5"; counter > 1? No none n == 1? Yes stop |
使用if選擇結構:
------------------------------------------------------------------------------------------------
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | int n = 20; int counter = 0; if (n % 2 == 0) { n = n/2; counter++; } if (n % 2 == 0) { n = n/2; counter++; } if (n % 2 == 0) { } else { cout << "2"; if (counter > 1) { cout << "^" << counter; counter = 0; if (n == 1) { } else { cout << " * "; } } } if (n % 3 == 0) { } if (n % 3 == 0) { } if (n % 4 == 0) { } if (n % 5 == 0) { n = n/5; counter++; } else { } if(n % 5 == 0) { } else "5"; if (counter > 1) { } else { //nothing } if (n == 1) { //stop; } } { cout << "5"; if (counter > 1) { } else { //nothing } if (n == 1) { //stop; } } |
這樣答案真的是
2^2 * 5
但沒辦法符合所有情形
所以加loops
並整理,除錯一下
------------------------------------------------------------------------------------------------
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 41 42 43 | #include <iostream> using namespace std; int main() { int n = 30; int counter = 0; for (int i = 2; i <= 1000000; i++) { if (n == 1) { break; } while(1) { if (n % i == 0) { n = n/i; counter++; } else { if (counter != 0) { cout << i; if (counter > 1) { cout << "^" << counter; } if (n != 1) { cout << " * "; } } counter = 0; break; } } } } |
80%已經寫完了
再來,要重複的輸入
while (cin >> n){}
------------------------------------------------------------------------------------------------
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 41 42 43 44 45 | #include <iostream> using namespace std; int main() { int n; int counter = 0; while (cin >> n){ for (int i = 2; i <= 1000000; i++) { if (n == 1) { break; } while(1) { if (n % i == 0) { n = n/i; counter++; } else { if (counter != 0) { cout << i; if (counter > 1) { cout << "^" << counter; } if (n != 1) { cout << " * "; } } counter = 0; break; } } } cout << endl; } } |
天啊,為了寫出這段程式,我花了3個小時
送出吧~
daniel.chu916@g... (DCtime Mc) a010. 因數分解 AC (3ms, 336KB) 2019-11-30 11:34
終於過了,我可不玩了...
留言
張貼留言