1. 程式人生 > >AC日記 - - - 9

AC日記 - - - 9

兩個 包括 計算 是否 重復 保存 長度 include sca

Description

計算機科學中的問題往往被歸納為某一類問題(如NP問題,無法解決問題,遞歸等)。在這道問題中你將分析一種算法,它對所有可能的輸入結果是未知的。
考慮以下算法: 1. 輸入n 2. 輸出n 3. 如果n=1然後停止 4. 如果n是奇數: n <-- n*3+1 5. 其他的情況: n <-- n/2 6. 轉向 2
例如:對於輸入22,輸出將會是22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1。據推測,該算法對於任何整數將終止於1。盡管算法很簡單,目前還不清楚這一猜想是否正確。但是對於所有整數n(0<n<1,000,000),已經過驗證(事實上,符合規律的數比這還要多)。
對於給定的n,是有可能計算出該算法共輸出了多少個數的,包括結尾的1,這個數叫做n的周期長度。在上面的例子中,22的周期長度是16。對於任何兩個數字i和j,求出在i和j之間的數中,周期長度最大的那個數的周期長度。

Input

輸入將包括一系列的整數對i和j,每行一對整數。所有整數將少於1000000 且大於0。你應該處理i和j(包括i,j) 之間的所有整數。可以假設,任何操作不會溢出32位整數。

Output

對於每一個對輸入整數i和j,輸出為i、j和最大周期長度。這三個數用空格分開,三個數在同一行,每兩個數之間有一個空格。

Sample Input

1 10 100 200 201 210 900 1000

Sample Output

1 10 20 100 200 125 201 210 89 900 1000 174

HINT

應該把已經計算過的數的周期長度保存下來,超時的原因是已經計算過的周期長度的重復計算,

Append Code

#include<stdio.h>
int a[1000000];
int main()
{
    int m, n, i, t=0, j, ii;
    while(scanf("%d %d", &m, &n)!=EOF)
    {
        t=0;
        for(i=m;i<=n;i++)
        {
            ii=i;
            if(a[i]==0)//判斷是否計算過周期,未計算則計算,計算過直接比較。
            {
                while(ii!=1)
              {
                
if(ii%2!=0) ii=3*ii+1; else ii=ii/2; a[i]++; } a[i]++; } if(a[i]>t) t=a[i]; } printf("%d %d %d\n", m, n, t); } }

AC日記 - - - 9