1293. 3n+1數鏈問題
Description
在電腦科學上,有很多類問題是無法解決的,我們稱之為不可解決問題。然而,在很多情況我們並不知道哪一類問題可以解決,那一類問題不可解決。現在我們就有這樣一個問題,問題如下:
1. 輸入一個正整數n;
2. 把n顯示出來;
3. 如果n=1則結束;
4. 如果n是奇數則n變為3n+1 ,否則n變為n/2;
5. 轉入第2步。
例如對於輸入的正整數22,應該有如下數列被顯示出來:
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
我們推測:對於任意一個正整數,經過以上演算法最終會推到1。儘管這個演算法很簡單,但我們仍然無法確定我們的推斷是否正確。不過好在我們有電腦,我們驗證了對於小於1,000,000的正整數都滿足以上推斷。
對於給定的正整數n,我們把顯示出來的數的個數定義為n的鏈長,例如22的鏈長為16。
你的任務是編寫一個程式,對於任意一對正整數i和j,給出i、j之間的最長鏈長,當然這個最長鏈長是由i、j之間的其中一個正整數產生的。我們這裡的i、j之間即包括i也包括j。
Input
輸入檔案只有一行,即為正整數i和j,i和j之間以一個空格隔開。0 < i ≤ j < 10,000。
Output
檔案只能有一行,即為i、j之間的最長鏈長。
Sample Input
1 10
Sample Output
20
Problem Source
ZSUACM Team Member
// source code of submission 980902, Zhongshan University Online Judge System#include <iostream>using namespace std;int LnkLength( int n){ int Length = 1; while (n!=1) { if ( n % 2 == 1 ) n = 3*n + 1; else n=n>>1; ++Length; } return Length;}int main(){ int i,j,max = 0; cin >> i >> j; for(int m = i;m <= j;m++) { if (LnkLength(m) >= max) max = LnkLength(m); } cout << max << endl; return 0;}