题意:有一个算法,对数字进行转化,定义为:
(1).输入一个正整数n;
(2).输出n;
(3).如果n=1,算法结束;
(4).如果n是奇数,将n转化为3n+1;
(5).如果n是偶数,将n转化为n/2;
(6).跳转到第2步。
例如对于输入的正整数22,会显示:22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
对于给定的正整数n,我们定义显示出来数字的个数为n的链长,例如22的链长为16
你的任务是编写一个程序,给出两个正整数i和j,输出i和j之间数字所拥有的最大链长(报告i.j)。
思路:直接暴力打表即可,注意i不一定比j小,需对其排序。(坑爹)
#include<cstdio>
int number[10000+10];
int solve(int x)
{
int ans=1;
while(x!=1)
{
if(x%2==0)
x/=2;
else
x=x*3+1;
ans++;
}
return ans;
}
int main()
{
int l,r,temp,left,right;
for(int i=1;i<=10000;i++)
number[i]=solve(i);
while(scanf("%d%d",&l,&r)!=EOF)//l和r的大小未定,需进行比较
{
left=l,right=r;
if(r<l)
left=r,right=l;
int max=-1;
for(int i=left;i<=right;i++)
if(max<number[i])
max=number[i];
printf("%d %d %d\n",l,r,max);
}
return 0;
}