找规律

题目描述:

实现一个函数,对一个正整数n,算得到1需要的最少操作次数。操作规则为:如果n为偶数,将其除以2;如果n为奇数,可以加1或减1;一直处理下去。

例如 5->4->2->1,5需要三步;7->8->4->2->1 最快需要四步,或者7->6->3->2->1这种走法。

当n是偶数时,将n除以2,如果n是奇数时,需要考虑最后两位是01或者11,当是01时,需要减去1,当是11时需要加上1,构成2的幂次方.

3是特殊情况,需要特殊处理

int minstep(int n){
    if((n%2) == 0)
    return 1+minstep(n/2);
    if(n == 1)
    return 0;
    if(n == 3)
    return 2;
    if((n & 3) == 3){  // 判断最后两位是11
       return 1+minstep(n+1);
    }
    if((n & 1) == 1){ // 判断最后两位是01
       return 1+minstep(n-1);
    }
}

或者这样写:

int minstep(int n){
    if((n%2) == 0)
    return 1+minstep(n/2);
    if(n == 1)
    return 0;
    if(n == 3)
    return 2;
    if((n & 2)){
       return 1+minstep(n+1);// 当最后两位是11时,和10的与存在
    }
    else{
       return 1+minstep(n-1);// 当最后两位是01时候
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值