1. 程式人生 > >CCF NOI1030. 角谷猜想 (C++)

CCF NOI1030. 角谷猜想 (C++)

1030. 角谷猜想

題目描述

角谷猜想又稱冰雹猜想。它首先流傳於美國,不久傳到歐洲,後來由一位叫角谷的日本人帶到亞洲。因為被稱為角谷猜想。

通俗地講,角谷猜想的內容是這樣的:任意給定一個自然數n,當n是偶數時,將它除以2,即將它變成n/2;當n是奇數時,就將它變成3n+1,……,若干步後,總會得到1。

在上述演變過程中,將每一次出現的數字排列起來,就會出現一個數字序列。

我們現在要解決的問題是:對於給定的n,求出數字序列中第一次出現1的位置。

輸入

輸入一個自然數n。

輸出

輸出序列中第一次出現1的位置。

樣例輸入

6

樣例輸出

9

資料範圍限制

1<=n<231

提示

數字的變化過程如下:
6→6÷2→3→3×3+1→10→10÷2→5→5×3+1→16→16÷2→8→8÷2→4→4÷2→2→2÷2→1
所形成的數字序列為:
6 3 10 5 16 8 4 2 1
1位於數字數列的第9個位置。

C++程式碼

#include <iostream>
#include <cassert>

using namespace std;

int main()
{
    int n;

    cin >> n;

    assert(n >= 1
); int seqNo = 1; // starting from itself while (n != 1) { #ifdef UNIT_TEST cout << n << ", " << seqNo << endl; #endif if (n%2 == 0) // even number { n /= 2; } else // odd number { n = 3
*n + 1; } seqNo++; } #ifdef UNIT_TEST cout << n << ", " << seqNo << endl; #endif cout << seqNo << endl; return 0; }