因此,有办法做到这一点,和/或优化它。愚蠢的我,我立即想要实现一个递归函数,后来导致了一个分段错误,然后我尝试采用动态编程,它似乎工作,但不知怎的,我得到了错误的答案。
问题Here
所以这是我的代码,我认为这是不言自明的。
#include <iostream>
using namespace std;
int cycleLength(long long int);
int cycleLengthResult[1000000];
int main(int argc, char *argv[])
{
int i = 0, j = 0, cur = 0, max = 0;
while ( cin >> i >> j )
{
if ( i > j ) //swap to ensure i <= j
{
int s = i;
i = j;
j = s;
}
for ( int k = i ; k <= j ; ++ k )
{
cur = cycleLength(k);
if (cur > max) max = cur;
}
cout << i << " " << j << " " << max << endl;
max = 0;
}
}
int cycleLength(long long int arg)
{
if ( arg > 1000000 ) //if out of array bound, then don't memorize, just calculate
{
if (arg % 2 == 0)
{
return 1 + cycleLength(arg/2);
}
else
{
return 1 + cycleLength(arg*3+1);
}
}
if (!cycleLengthResult[arg-1]) //if result for arg doesn't exist then....
{
int valueForArg = 0;
if (arg == 1)
{
valueForArg = 1;
}
else if (arg % 2 == 0)
{
valueForArg = 1 + cycleLength(arg/2);
}
else
{
valueForArg = 1 + cycleLength(arg*3+1);
}
cycleLengthResult[arg-1] = valueForArg;
}
return cycleLengthResult[arg-1];
}
我通过了所有的样本输入,并且还通过了(1,1000000)进行速度测试。但似乎这不是问题所在。
我想修复我的代码,而不是改变使用的方法,当然,我可以不使用递归,而是在main中使用循环,这不会溢出。但它很有趣。
答案 0 :(得分:2)
仔细阅读声明:
整数i和j必须按照它们在输入中出现的顺序出现在输出中
所以在阅读并打印保存的值后保存它们。