普通方法超时求简便方法

给定正整数 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;
}

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

从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);
    }
}