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。输入没有明确的结束。我处理了所有这些。但仍然得到错误的答案。
答案 0 :(得分:0)
你的代码还可以。
唯一的问题是你的输入处理直到文件结束。while(!cin.eof())
更改为while(cin>>i>>j)
即可。你会得到AC:)
答案 1 :(得分:0)
'\n'
可能有问题吗?尝试使用cout<<f<<' '<<g<<' '<<max<<endl;