题目地址: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