华为OD机试 - 贪吃的猴子(Java & JS & Python & C & C++)
题目描述:
一个猴子有X个桃子,它每天都会吃现有的一半(四舍五入到最近的整数),并且每天都会生产一个新的桃子。有一天它会吃掉所有的桃子。假设猴子不会死,问需要多少天它会吃掉N(0 < N < 2^31)个桃子。
输入描述:
每行包含一个正整数N,代表猴子吃的桃子数量。
输出描述:
输出猴子吃掉N个桃子所需的天数。
示例:
输入:
输出:
说明:
当输入为1时,猴子开始有1个桃子。第1天吃掉1个,生产1个,有2个桃子。第2天吃掉1个,生产1个,有2个桃子。总共需要2天。
解法:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
int n = scanner.nextInt();
System.out.println(calculateDays(n));
}
scanner.close();
}
private static int calculateDays(int n) {
int days = 0;
while (n > 0) {
n = (n + 1) / 2; // 新产的桃子算上现有的桃子
days++;
}
return days;
}
}
注意:
- 输入的N是指猴子吃掉的桃子数,而不是猴子一开始就有的桃子数。
- 每天吃的桃子数量是当前所有的桃子数量的一半(向上取整),新产的桃子数是原有的桃子数量加1。
- 每天结束后,猴子的总桃子数就是所有吃掉的桃子数量和新产的桃子数量之和。
- 当猴子吃掉所有的桃子,即peanuts之和为0时,计算结束。
评论已关闭