--- tags: DICE C --- 19-6 3N+1-3 === > [name=CHAWTeam] 目錄:[DICE C語言程式破解](https://hackmd.io/@CHAWTeam/DiceC) 題目 --- ```! 考慮到下面的演算法: 輸入一個整數n,依據以下規則,輸出其結果。 如果n是奇數,則n=3n+1, 其餘的狀況,則n=n/2, 當n等於1時停止。  例如,輸入22,則會印出下列的數列: 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 上面這個演算法,目前被推測認為在給予任何整數輸入值時皆可以停下來(也就是說最後都能夠輸出1)。 儘管這個演算法還蠻簡單的,但卻無法確定這個推測是否是正確的; 然而可以確定的是,在輸入值n介於0到1,000,000之間時,這個推測是正確的 (實際上,還有比0到1,000,000更多的輸入值也是可以讓演算法停下來)。 輸入一個整數n,我們可以去算出總共會有幾個數字會被印出(包含1), 而這個總數就被稱作n的迴圈長度(cycle-length of n)。 在上面的範例中,22的迴圈長度為16。 輸入任2個整數i,j,請找出 i 到 j 之間(包含i、j)的數所產生的數列中,最大的 cycle length 是多少。 輸出格式如輸出範例所示。 程式重複輸入,直到輸入的i、j皆等於0才停止。 輸入範例: 10 1 100 200 201 210 900 1000 0 0 輸出範例: 10 1 20 100 200 125 201 210 89 900 1000 174 ``` 程式碼 --- ```c= #include <stdio.h> int san_n_jia_i(int n) { if (n == 1) return 1; else if (n % 2 == 0) return n / 2; else if (n % 2 == 1) return 3 * n + 1; } int main() { int i, j, t, n, nTimes, nMaxTimes; scanf("%d %d", &i, &j); while (i != 0 && j != 0) { nMaxTimes = 0; printf("%d %d ", i, j); if (i > j) { t = i; i = j; j = t; } for ( ; i <= j; i++) { nTimes = 0; n = i; while (n != 1) { n = san_n_jia_i(n); nTimes++; } if (n == 1) nTimes++; if (nTimes >= nMaxTimes) nMaxTimes = nTimes; } printf("%d\n", nMaxTimes); scanf("%d %d", &i, &j); } return 0; } ``` 執行 --- ### 輸入 ```! 10 1 100 200 201 210 900 1000 0 0 ``` ### 輸出 ```! 10 1 20 100 200 125 201 210 89 900 1000 174 ``` --- [查看我們在HackMD上的所有筆記](https://hackmd.io/@CHAWTeam) 目錄:[DICE C語言程式破解](https://hackmd.io/@CHAWTeam/DiceC) --- {%hackmd Iiu5mOixR7yWkPHKCkabBg %} <iframe class="LikeCoin" height="235" src="https://button.like.co/in/embed/chawteam/button?referrer=https://hackmd.io/@CHAWTeam/DiceC-19-6" width="100%"></iframe> --- {%hackmd i1nMRrZcTFmTvoF897K9zg %}