3n+1 数链问题
来源:互联网 发布:荣威550解码软件 编辑:程序博客网 时间:2024/05/17 22:55
在计算机科学上,有很多类问题是无法解决的,我们称之为不可解决问题。然而,在很多情况下我们并不知道哪一类问题可以解决,哪一类问题不可以解决。现在我们就有一个问题,问题如下:
1、 输入一个正整数n;
2、 把n显示出来;
3、 如果n=1则结束;
4、 如果n是奇数则n变为3×n+1,否则n变为n/2;
5、 转入第二步;
例如对于输入的正整数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。
输入输出样例:
Simple input
Output for the input
1 10
8 8
100 200
201 210
20
4
125
89
解:
本题没什么特殊技巧,最简单的就是用穷举法一个个比较。
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int link3(int data){
int count=1;
while(data!=1){
if(data%2==0) data/=2;
else data=data*3+1;
++count;
}
return count;
}
void main(){
int max,i,j,t;
while(1){
scanf("%d%d",&i,&j);
if(i==0 && j==0) exit(0);
max=0;
for(;i<=j;i++){
t=link3(i);
if(t>max) max=t;
}
printf("%d ",max);
}
}
#include<string.h>
#include<stdlib.h>
int link3(int data){
int count=1;
while(data!=1){
if(data%2==0) data/=2;
else data=data*3+1;
++count;
}
return count;
}
void main(){
int max,i,j,t;
while(1){
scanf("%d%d",&i,&j);
if(i==0 && j==0) exit(0);
max=0;
for(;i<=j;i++){
t=link3(i);
if(t>max) max=t;
}
printf("%d ",max);
}
}
- 3n+1 数链问题
- 1293. 3n+1数链问题
- 1293. 3n+1数链问题
- 3n+1数链问题
- 1293. 3n+1数链问题
- 1293[3n+1数链问题]
- 3n+1 数链问题(数论)
- 1293. 3n+1数链问题
- 3n+1数链问题--递归
- 3n+1数链问题
- 3n+1数链问题
- 3n+1数链问题
- WOJ1314-3n+1数链问题
- 3N数链问题
- [数论][题目]3n+1数链问题
- sicily 1000. 3n+1数链问题
- POJ 1207(3n+1数链问题)
- [1601]3n+1数链问题 sdutOJ
- 00112233
- c#编程规范以及好习惯
- 如何将rmvb视频文件制作成DVD视频光盘
- windows 2003 r2 iis6.0中集成tomcat6.0(虚拟主机)
- 做了一个directshow的filter,把RGB视频流变成黑白的
- 3n+1 数链问题
- 提高编写bug report的质量10条建议
- 华为通报显示员工已完成调岗 称其要努力活着
- ftp作业
- 无线你的电池 Splashpower推出充电板
- 有关多线程的研究的例子
- 打算学习windows编程
- 97世界编程大赛冠军的程序
- 高级机密