C++與演算法

解答 - The 3n + 1 problem

注意範圍兩數,有可能先大後小。那就要先交換再開始做。

其他照著題意硬作就可以了。


一次 3n+1 的運作: 對於每一個正整數,如果它是奇數,則把它乘 3 再加 1;如果它是偶數,則把它除以 2,不斷重複,直到得到1為止。


讓 k = 最小值, 最小值+1, ... 最大值-1, 最大值

對每個 k 需要模擬一次 3n+1 的運作,並且記錄會跑幾次

若本次紀錄的次數比之前記錄的答案還大,就替換答案。

#include<iostream>
using namespace std;


int main()
{
    int left, right, tmp;
    int k, k_tmp;
    int ans, ans_tmp;

    while( cin >> left >> right )
    {
        cout << left << " " << right << " ";
        if( left > right )
        {
            tmp = left;
            left = right;
            right = tmp;
        }

        ans = 0;
        k = left;
        while( k<=right )
        {
            ans_tmp = 1;

            k_tmp = k;
            while( k_tmp != 1 )
            {
                if( k_tmp%2 == 0 )
                    k_tmp = k_tmp/2;
                else
                    k_tmp = k_tmp*3+1;

                ans_tmp = ans_tmp+1;
            }

            if( ans_tmp > ans )
                ans = ans_tmp;

            k = k+1;
        }

        cout << ans << endl;
    }
    return 0;
}