---
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 %}