题目描述
小明从糖果盒中随意抓一把糖果,每次小明会取出一半的糖果分给同学们。
当糖果不能 平均分配只时,小明可以选择从糖果盒中(假设盒中糖果足够)取出一个糖果或放回一个糖果。
小明最少需要多少次(取出、放回和平均分配均记一次),能将手中糖果分至只剩一颗。
输入描述
抓取的糖果数(n < 10000000000
)
输出描述
最少分至一颗糖果的次数
示例
输入
15
输出
5
说明
1.15+1=16;
2.16/2=8;
3.8/2=4;
4.4/2=2;
5.2/2=1;
题解
- 如果末位不等于0, 说明为偶数,不需要拿或者放
- 如果倒数第二位为 0 则减去一次可以消除至少两位
- n
≥
\geq
≥ 3
- n = = = 3 的时候,减一需要分一次即可, 加一需要分两次,选择减一
- 其它说明有多个1 , 增加一个可以消除多个1 ,使拿糖果的次数降为最少
源码Java
public class DivCandy {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int div = 0;
while (n > 1) {
// 如果末位不等于0, 说明为偶数,不需要拿或者放
if ((n & 1) == 0) {
n = n >> 1;
} else if ((n & 2) == 0) {
// 如果倒数第二位为 0 则减去一次可以消除至少两位
n = n - 1;
} else {
// n 等于 3 的时候,减一位分一次可以为0
if (n == 3) {
n = n - 1;
} else if ( n > 3 ) {
// 其他情况说明有多个1 , 增加一个可以消除多个1 ,使拿去糖果的次数降为最小
n += 1;
}
}
div++;
}
System.out.println(div);
}
}