山东理工大学ACM平台题答案关于C语言 1601 3n+1数链问题
3n+1数链问题
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
在计算机科学上,有很多类似的问题是无法解决的,我们称之为不可解决问题。然而,在很多情况下我们并不知道哪一类问题可以解决,哪一类问题不可解决。现在我们就有这样一个问题,问题如下:(1)输入一个正整数n;
(2)把n显示出来;
(3)如果n=1则结束;
(4)如果n是奇数则n变为3*n+1,否则变为n/2;
(5)转入第(2)步。
例如对于输入的正整数22,应该有如下数列被显示出来:
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
我们推测:对于任意一个正整数,经过以上算法最终会推到1。尽管这个算法很简单,但我们仍然无法确定我们的推断是否正确。不过好在我们有计算机,我们验证了对于小于1000000的正整数都满足以上推断。
对于给定的正整数n,我们把显示出来的数的个数定义为n的链长,例如22的链长为16。
你的任务是编写一个程序,对于任意一对正整数i和j,给出i与j之间的最大链长,当然这个最长链长是由i与j之间的其中一个正整数产生的。我们这里的i和j即包括i也包括j。
输入
输入两个正整数i、j,i和j之间以一个空格隔开。0 < i <= j < 10000。输出
输出数据只有一行,即为i与j之间的最长链长。示例输入
1 10
示例输出
20
#include
int getLinkLen(int n)
{
if (n == 1) return 1;
return n&1 ? getLinkLen(n*3+1)+1 : getLinkLen(n/2)+1;
}
int main()
{
int x, y, i, t, max = 0;
scanf("%d %d", &x, &y);
for (i=x; i<=y; i++){
t = getLinkLen(i);
if (t > max) max = t;
}
printf("%d/n", max);
return 0;
}
int getLinkLen(int n)
{
if (n == 1) return 1;
return n&1 ? getLinkLen(n*3+1)+1 : getLinkLen(n/2)+1;
}
int main()
{
int x, y, i, t, max = 0;
scanf("%d %d", &x, &y);
for (i=x; i<=y; i++){
t = getLinkLen(i);
if (t > max) max = t;
}
printf("%d/n", max);
return 0;
}
>更多相关文章
- 09-29如何通过wrap malloc定位C/C++程序的内存泄漏
- 02-25打车软件大战升级,补贴还能维持多久?
- 12-23BMP文件右旋90度[c语言]
- 12-23寻找直方图中面积最大的矩形(C语言版)
- 12-23[ndk,2]ndk开发案例和错误处理
- 12-23[ndk,1]ndk开发,C语言入门讲解
- 12-23C语言连续存储实现队列机制
- 12-23Objective-c 数据类型
首页推荐
佛山市东联科技有限公司一直秉承“一切以用户价值为依归
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 04-29通用智能人“通通”亮相中关村论坛
- 04-29拼多多投入45亿补贴,助力上海“五五购物节
- 04-29通义千问再开源 推出最大尺寸1100亿参数模型
- 04-29【环球视线】比亚迪交付首列出海云轨
- 04-21中国产品数字护照体系加速建设
相关文章
24小时热门资讯
24小时回复排行
热门推荐
最新资讯
操作系统
黑客防御