CCF NOI1030. 角谷猜想 (C++)
阿新 • • 發佈:2018-12-11
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;
}