CollatzCollatz CollatzCollatz 問題 (又稱 「3N +1」問題 ),一開始給定個大於 1 的正整數 N,其變換方法如下:
- 若 N 為偶數 (即 N 可被 2 整除),則把 N 除以 2,即 N → N ÷ 2。
- 若 N 為大於 1 的奇數 (即 N 不可被 2 整除),則把 N 乘 3 再加 1,即 N → (3N +1)。
- 若 N 為 1,則結束。
比如說從 5 開始的話, 其變換的步驟如下: 5 → 5×3+1=16 → 16 ÷2=8 → 8÷2=4 → 4÷2=2 → 2÷2=1
再舉個例子,最開始的數取 7,我們得到下面的序列:
7→22 →11 →34 →17 →52 →26 →13 →40 →20 →10 →5→16 →8→4→2→1
這次複雜了一點, 其中一共做了 16 次的變換, 但是 我們最終還停止在 1
現在要請你寫一個程式來求出轉換的次數 。
範例測資
範例輸入 | 範例輸出 |
---|---|
測試資料為1~10 列以 EOF 結束,每列為一個 正整數 N,其值介於 2 至 30000 。 | 對每列輸入,輸出資料為一個正整數, 共要做多少次變換 N 才會停止在 1。 |
3 5 7 | 7 5 16 |
解題思路
宣告一個函式,回傳值會需要兩個整數,分別是目前運算的數字以及運算次數。
每一次判斷 3N+1 問題的時候都要回傳數值,然後記得每次的運算次數都要 +1,如果運算數字為 1,則 return 運算次數。
範例程式碼-ZeroJudge B553: Collatz 問題
#include <iostream>
using namespace std;
int calc(int N, int count)
{
if (N == 1) return count;
if (N % 2 == 1) return calc((3*N)+1, count+1);
return calc(N/2, count+1);
}
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
int N;
while (cin >> N)
{
cout << calc(N, 0) << "\n";
}
}
//ZeroJudge B553
//Dr. SeanXD