1. 程式人生 > >3n+1數鏈問題--遞迴

3n+1數鏈問題--遞迴

數鏈問題

Time Limit: 1000ms   Memory limit: 65536K  有疑問?點這裡^_^

題目描述

給定一個整數N,如果N是偶數,把它除以2;如果N是奇數,把它乘以3加1。用新得到的值重複上述步驟,直到N=1時停止。例如,N=22時該演算法的生成序列是:22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1。   人們猜想對於任意整數N,該演算法總能終止於N=1。這個猜想對於至少1000000內的整數都是正確的。

對於給定的N,該序列的元素(包括1)個數被稱為N的迴圈節長度。在上述例子中,22的迴圈節長度為16。輸入兩個數i和j,你的任務是計算i到j(包含i和j)之間的整數中,迴圈節長度的最大值。

輸入

輸入每行兩個整數i與j(0 < i <= j < 1000000)。

輸出

對於每對整數i與j,按原來的順序輸出i與j,然後輸出兩者之間的整數中的最大迴圈節長度以及取得該最大迴圈節的整數。這四個整數應該用單個空格隔開,且在同一行輸出。

示例輸入

22 22
1 10

示例輸出

22 22 16 22
1 10 20 9
這本來是一道水題,本弱一開始唯一怕的是超時,結果寫了一個暴力的竟然死活通不過
後來上網看到大牛用遞迴寫的頓時恍然大悟(我特麼遞迴白學了)
#include <iostream>
#include <cstdio>
using namespace std;
int lenth(int n)
{
	if(n==1) return 1;
	if(n%2==1) return 1+lenth(n*3+1);
	else
		return 1+lenth(n/2);
}
int main()
{
	int a,b,i;
	while(cin>>a>>b)
	{
		int max=lenth(a),pos=a;
		for(i=a+1;i<=b;i++)
			if(max<lenth(i))
			{
			max=lenth(i);
			pos=i;
			}
		cout<<a<<" "<<b<<" "<<max<<" "<<pos<<endl;
	}
	return 0;
}