问题描述
有这样一道智力题: “ 某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?” 答案是5 瓶。方法如下:先用9 个空瓶子换 3 瓶汽水,喝掉 3 瓶满的,喝完以后 4 个空瓶子,用 3 个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以 后用 3 个空瓶子换一瓶满的还给老板。如果小张手上有 n 个空汽水瓶,最多可以换多少瓶汽水喝?
输入描述:
输入文件最多包含 10 组测试数据,每个数据占一行,仅包含一个正整数 n ( 1<=n<=100 ),表示小张手上的空汽水瓶数。 n=0 表示输入结束,你的程序不应当处理这一行。
输出描述:
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出 0 。
示例1:
输入
310810
输出
1540
分析
当有 n 个空瓶时候,我们设总共可以喝 total 瓶饮料,那么当 n>2 时,说明我们可以去换饮料喝。 3 个换一瓶,那么可以换n/3 瓶饮料。接下来,这些饮料喝完后,势必还有空瓶。那么喝完n/3 瓶饮料之后的空瓶数是多 少?答案是:n/3+n%3.
这里需要注意: n/3 代表换来的饮料,但是这些喝完之后,不就是空瓶吗?相同的为什么需 要n%3? 因为比如 n==4, 最后的空瓶数应该是: 2. 不就是 n/3+n%3 吗?到这里,我们在看一下。 n>2 时,可以去换, 那么n==2 时,我们可以去商铺借一瓶饮料。那么又多喝了一瓶。
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
System.out.println(Number(n));
}
}
public static int Number(int n){
int target = 0;
while(n>2){
target = target + n/3; //兑换瓶子数
n = n/3 + n%3; //空拼子数
}
if(n == 2){
target++;
}
return target;
}
}