-1

UVa の 3n+1 問題へのリンクは次のとおりです: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=36

私のコードは次のとおりです。

#include<iostream>
using namespace std;


long long l(long long n)
{
        if(n==1)
        {
                return 1;
        }
        if(n%2)
        {
                return 1+l(3*n+1);
        }
        else
        {
                return 1+l(n/2);
        }
}


int main()
{
        long long i,j,k,max=0,f,g;
        while(!cin.eof())
        {
                cin>>i>>j;
                f=i;
                g=j;
                if(i>j)
                {
                        long long temp;
                        temp=i;
                        i=j;
                        j=temp;
                }
                max=0;
                for(long long a=i;a<=j;a++)
                {
                        k=l(a);
                        if(k>max)
                        {
                                max=k;
                        }
                }
                cout<<f<<' '<<g<<' '<<max<<'\n';
        }   
        return 0;
}

私のコードを説明するために、単純な再帰を使用しています。入力は i、j として取得され、それぞれ f、g を使用してそのまま保持されます。i と j は、temp を使用して明示的に交換されます。max はすべてのテスト ケースで 0 に設定されます。k は、長さ関数 l() によって送信された結果を保持するために使用され、現在までの最大長を格納する max でテストされます。

私のソリューションは、問題で指定されたすべての簡単なテスト ケースに合格します。i が j より大きい、および i==j を含むすべてのトリッキーなテスト ケースにも合格します。この問題は、long の要件に関する不完全な情報を提供することによって、整数オーバーフローを隠します。私もそれを処理しました。出力は、i、j を同じ順序で要求します。入力は明示的な終わりを与えません。私はそれらすべてを扱いました。しかし、まだ間違った答えを得ています。

4

2 に答える 2

0

あなたのコードは大丈夫です。
唯一の問題は、ファイルの終わりまでの入力処理です。
に変更while(!cin.eof())するだけwhile(cin>>i>>j)です。あなたはACを得るでしょう:)

于 2015-03-19T12:05:25.140 に答える
0

に問題がある可能性があり'\n'ますか?使ってみてcout<<f<<' '<<g<<' '<<max<<endl;

于 2015-03-19T12:06:19.170 に答える