-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). 你会得到交流电 :)

于 2015-03-19T12:05:25.140 回答
0

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

于 2015-03-19T12:06:19.170 回答