题目链接:
https://www.dotcpp.com/oj/problem1095.html
题目大意:
题目给你定义了这样处理数字的方式。如果这个数字是偶数的话,你就需要将其除以2,而如果是奇数的话,就是3n+1。比如说:n=3,就会变成①3,②33+1=10,③10/2=5,④5*3+1=16,⑤16/2=8,⑥8/2=4,⑦4/2=2,
⑧2/2=1.当处理到1的时候即认为处理结束。而这其中所经历的步骤数则需要我们记录下来。这个例子中的步骤数就是8.
然后题目说给你两个变量,i和j叫你找出这个范围内的数中符合上面算法中的最大步骤数,并输出来。
思路:
这道题最开始我想多了,还以为是需要用到dp递归之类的,结果emm超时了。所以我改变了下思路,就是直接将这个i和j接收进来进行处理,没有想到居然成功了。(详情请看代码)
哦,对了,说一下这题中的细节性的东西。
就是i和j在题述中并没有准确地说明白j比i大,故在我们写程序的时候需要提前判断一下i和j的大小,如果i大于j的话,需要交换一下位置再处理后面的。
ac代码:
#include<stdio.h>
#include<string.h>
int main(){
int i,j,ans;
int temp;
int num;
while(~scanf("%d%d",&i,&j)){
printf("%d %d ",i,j);
if(i>j){//交换两者位置
temp = i;
i = j;
j = temp;
}
ans = 0;
for(int k = i;k <= j;k++){
// printf("k:%d ",k);
num = 1;
temp = k;
while(temp!=1){
num++;
if(temp%2==0){
temp = temp/2;
}else{
temp = temp*3 + 1;
}
}
// printf("%d\n",num);
if(num>ans){
ans = num;
}
}
printf("%d\n",ans);
}
return 0;
}