题目大意:
按照这种规则来编程。然后中途算出的数的个数成为一个cycle-length ,求出i与j之间的最大cycle-length.i与j<1000000.
1. input n
2. print n
3. if n = 1 then STOP
4. if n is odd then n <- 3n + 1
5. else n <- n / 2
6. GOTO 2
解题思路:
一开始想的就是一般的写法肯定是超时,本来直接敲是想找出规律来,没想到,真的就是暴力,不超时。。。有一些cycle_len可以达到几百,也就是说运算次数有可能达到1亿,这样都不超?好吧,我都无语了。。。
吐吐槽:
注意是求出i与j之间的,并没有说明i小于j,而且输出说输出的i,j顺序要跟输入一样。
代码:
#include
#include
#include
#include
using namespace std;
int f(int a, int sum, vector &vec)
{
sum++;
vec.push_back(a);
if(a == 1)
{
/*cout << vec.size() << ": ";
sort(vec.begin(), vec.end());
for(int i = 0; i < vec.size(); i++)
cout << vec[i] << " ";
cout << endl;*/
return sum;
}
else
{
if(a % 2)
{
f(3 * a + 1, sum, vec);
}
else
f(a / 2, sum, vec);
}
}
int main(void)
{
int s, e;
while(scanf("%d %d", &s, &e) == 2)
{
bool flag = false;
if(s > e)
{
s = s ^ e;
e = s ^ e;
s = s ^ e;
flag = true;
}
int max = 0;
for(int i = s; i <= e; i++)
{
vector vec;
int temp = f(i, 0, vec);
if(temp > max)
{
max = temp;
}
//cout << endl;
}
if(flag)
printf("%d %d %d\n", e, s, max);
else
printf("%d %d %d\n", s, e, max);
}
return 0;
}