题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1032
一、题目要求
1)给出一个正整数n,如果n为奇数,则n=3n+1,否则n=n/2
2)设数n按1)中的运算方式,最少经过CollatzStep(n)次运算能够变成1
3)现给出两个正整数i和j,问数i和j之间所有数字里函数CollatzStep(n)可取到的最大值
需要注意的是:
1)i与j的大小关系是不一定的
2)最后输出结果时数字i和j需要按照顺序输出
二、程序代码
#include<iostream>
using namespace std;
//计算一个正整数经过奇偶归一猜想多少步可以到1
int CollatzStep(int n)
{
int step = 1;
while(n != 1)
{
if(n % 2)
{
n = 3 * n + 1;
}
else
{
n /= 2;
}
step++;
}
return step;
}
int main()
{
int i, j, cur; //最小值i,最大值j,cur用来进行从i到j的遍历
int temp; //临时变量
int curstep; //数字cur迭代到1所花费的步数
int maxstep; //从i到j所有数字需花费的最大迭代步数
while(cin >> i >> j)
{
//统计最大迭代步数
maxstep = 0;
for(cur = (i > j ? j : i); cur <= (i > j ? i : j); cur++)
{
curstep = CollatzStep(cur);
maxstep = curstep > maxstep ? curstep : maxstep;
}
//输出结果
cout << i << ' ' << j << ' ' << maxstep << endl;
}
return 0;
}
END