黑马程序员技术交流社区
标题:
可乐瓶题目欢迎来挑战
[打印本页]
作者:
执剑人
时间:
2016-3-7 11:23
标题:
可乐瓶题目欢迎来挑战
1,普通版
这是我同学给我出的,给定一个数的可乐数,比如20;
四个可乐盖克换一瓶可乐,两个可乐瓶刘可义换一瓶可乐;
最后喝了多少瓶可乐?
2,进阶版
已知最后喝了n瓶。能求出买了多少瓶么?
作者:
洋葱头头
时间:
2016-3-7 13:22
帮顶 做出来有分{:2_31:}
作者:
玉质彼端
时间:
2016-3-7 15:46
@洋葱头头,我是来拿分的
import java.util.Scanner;
/**
*
* 1,普通版
* 给定一个数的可乐数,比如20; 四个可乐盖可换一瓶可乐,两个可乐空瓶可换一瓶可乐; 最后喝了多少瓶可乐?
* 2,进阶版
* 已知最后喝了n瓶。能求出买了多少瓶么?
*/
public class DrinkTest {
private static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
// 普通版
System.out.print("请输入可乐数:");
int num = sc.nextInt();
System.out.println("可以喝到的可乐总数:" + (num + drinkTotalBySwap(num, num)));
System.out.println("----------------华丽的分隔线----------------");
// 进阶版
System.out.print("请输入最后喝到的可乐数:");
int cokeNum = sc.nextInt(); // 最后喝到的可乐数
int cokeBuyNum = 0; // 需要买这么多瓶可乐,累加思想
while (true) {
cokeBuyNum++; // 如果买这么多瓶可乐(每次+1遍历所有情况)
// 那么总共能喝到下面这么多瓶可乐
int cokeNumCanDrink = cokeBuyNum + drinkTotalBySwap(cokeBuyNum, cokeBuyNum);
// 如果从假设中得到最终可喝到的可乐数大于等于实际输入喝到的可乐数,则表明我们找到了ta到底买了多少瓶可乐
if (cokeNumCanDrink >= cokeNum) {
System.out.println("你买了" + cokeBuyNum + "瓶可乐,海量啊兄弟,一次饮胜了呗!");
break;
}
}
}
/**
* 模拟交换过程,根据当前喝完可乐后得到的瓶盖数和空瓶数得到还可以喝多少瓶可乐
*
* @param capsNum
* 当前喝完可乐后得到的瓶盖数
* @param emptyBoNum
* 当前喝完可乐后得到的空瓶数
* @return 返回剩下的瓶盖和空瓶总共可以交换到的可乐数
*/
public static int drinkTotalBySwap(int capsNum, int emptyBoNum) {
System.out.println("喝完可乐后剩余的瓶盖" + capsNum + "个," + "空瓶" + emptyBoNum + "个");
// 通过交换后又得到的新可乐瓶数
int swapCoke = capsNum / 4 + emptyBoNum / 2;
System.out.println("当前可以交换获得" + swapCoke + "瓶可乐");
if (swapCoke > 0) {
int capsLeftNum = swapCoke + capsNum % 4; // 把交换得到的可乐喝完后,剩下的瓶盖数
int emptyBoLeftNum = swapCoke + emptyBoNum % 2; // 把交换得到的可乐喝完后,剩下的空数
// 递归,累加每次交换后有能喝到的可乐数
return swapCoke + drinkTotalBySwap(capsLeftNum, emptyBoLeftNum);
} else {
// 递归截止条件,当剩下的瓶盖数与空瓶不能再交换可乐时,停止交换过程
System.out.println(""); // 只是控制打印格式,这句忽略ta
return 0;
}
}
}
复制代码
作者:
BlackFlag
时间:
2016-3-7 17:04
package com.itheima;
import java.util.Scanner;
/**
* 10、28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?(需写出分析思路)
*
*
*
* 思路: 最优的思路是要满足3个人喝可乐,最少只需要买2瓶可乐。因为喝完2瓶之后可以再借一个瓶盖,凑够3个瓶盖再去换一瓶,
* 喝完之后可以把这个瓶盖还掉,这样的话就不会有多余的瓶盖剩余。 也就是说,要满足m人喝可乐,最少需要买2/3m瓶可乐。
* 有时候2/3m会不是一个整数,这时候则需要向上取整来满足条件。
*
*/
public class Test10
{
public static void main(String[] args)
{
// 定义scanner对象来用于键盘输入
Scanner scanner = new Scanner(System.in);
System.out.println("请输入人数:");
// 键盘输入人数
int peopleNum = scanner.nextInt();
// 要买的瓶数是人数的2/3,然后使用Math.ceil()向上取整
int buyNum = (int) Math.ceil(peopleNum * 2.0 / 3);
// 控制台输出
System.out.println(peopleNum + "人需要买" + buyNum + "瓶可乐");
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2