ZeroJudge B553: Collatz 問題

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

發佈留言