给定正整数 s 和 t,保证 s<t,我们希望利用增长或翻倍的操作,让 s 变成 t。
增长操作可以让数字加一,即 x←x+1;
翻倍操作可以让数字翻倍,即 x←2×x。
请问最少需要用多少步操作才能将 s 变成 t?
【样例1】
1 4
【样例2】
2 10
【样例1】
2
【样例2】
3
从t开始计算到不小于s的次数,再加上与s的差
你题目的解答代码如下:
#include<stdio.h>
int main(){
int s,t,n=0,p;
scanf("%d%d",&s,&t);
while(t>=s)
{
p = t;
if(t%2==0)
t /= 2;
else
t -= 1;
n++;
}
n--;
printf("%d\n",n+(p-s));
return 0;
}
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
从t找s,奇数减1,偶数除2
#include<stdio.h>
int main(){
int a,b,count=0;
scanf("%d%d",&a,&b);
while(b > a)
{
if(b==a)
break;
if(b%2==0)
b=b/2;
else
b=b-1;
count++;
}
printf("%d\n",count);
return 0;
}
从 t 入手递归求解,java版,供参考
public class Test {
/**
* 递归获取倍数的步数
* @param source
* @param base
* @return
*/
public static int getStep(int source,int base)
{
System.out.println("源数据:"+ source+ "基础数据:"+ base);
if (source <=base) {
return 0;
}
if (source%2!=0)
{
return getStep(source-1,base)+1;
}
if (source> base)
{
return getStep((source/2)+ (source%2), base) + 1;
}
return getStep(source/2,base)+1;
}
public static void main(String[] args){
int record= getStep(11,2);
System.out.println("结果:"+ record);
}
}