UVa上的3n + 1(C ++)

时间:2015-03-19 11:03:24

标签: c++ collatz

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。输入没有明确的结束。我处理了所有这些。但仍然得到错误的答案。

2 个答案:

答案 0 :(得分:0)

你的代码还可以。
唯一的问题是你的输入处理直到文件结束。 只需将while(!cin.eof())更改为while(cin>>i>>j)即可。你会得到AC:)

答案 1 :(得分:0)

'\n'可能有问题吗?尝试使用cout<<f<<' '<<g<<' '<<max<<endl;