3n+1 是 UVa (C++)

3n+1 on UVa (C++)

UVa 上 3n+1 问题的 link 是: 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 的顺序相同。输入没有给出明确的结束。我处理了所有这些。但仍然得到错误的答案。

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

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