题目描述:
实现一个函数,对一个正整数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时候
}
}