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 を同じ順序で要求します。入力は明示的な終わりを与えません。私はそれらすべてを扱いました。しかし、まだ間違った答えを得ています。