- package test;
- /*
- * 3个瓶盖换一个可乐,多个人喝,需要买多少够喝.
- */
- public class Test010 {
- public static void main(String[] args) {
- int man = 50;// 定义人数
- int pinggai = 0;// 定义已有瓶盖的数量;
- jisuankele(man,pinggai);
- }
- public static void jisuankele(int man,int pinggai) {
- // 已知人数,求需要买多少瓶可乐
- int sum = 0;// 定义sum变量,为最终喝到的可乐的数量
- int min = 0;// 定义最少需要购买的可乐数量.
- for (int x = 0; sum < man; x++) {
- // 循环遍历,x为购买的可乐的数量,当最终喝到的可乐数量大于等于人数的时候结束循环
- sum = jisuan(x, pinggai);// 调用方法,当购买x瓶的时候,最终喝到sum瓶.第二的参数为手里的瓶盖数量
- min = x;// 返回喝到可乐的数量的同时,也返回购买的可乐的数量
- }
- System.out.println("需要购买" + min + "瓶可乐,才够" + man + "人喝~");
- }
- public static int jiaohuan(int pinggai) {
- // 设置一个方法,已知瓶盖数量,返回交换到的可乐数量
- return pinggai / 3;
- }
- public static int jisuan(int kele, int shengyu) {
- // 设置方法,已知购买可乐数量,和已有的瓶盖数量,得到最终喝到的可乐数量.
- int sum = 0;// 设置一个变量,存储最后喝到的可乐数量.
- if (kele < 0) {
- return -1;// 如果可乐数量小于0,返回-1.
- } else if ((kele + shengyu) >= 3) {
- // 如果可乐加瓶盖数量大于等于3,就可以用正常方式换得可乐,调用交换方法.
- // 喝到的可乐的数量,等于可乐的数量加上通过交换最终喝到的可乐的数量.
- // 用来交换的瓶盖,等于喝剩下的瓶盖,和上一次交换剩下的瓶盖.
- int i = (kele + shengyu) % 3;// 定义变量存储这次交换,将会剩余瓶盖数量
- sum = kele + jisuan(jiaohuan(kele + shengyu), i);
- } else if ((kele + shengyu) == 2) {
- // 当喝完可乐,手里瓶盖数量等于2的时候,可以赊账,赊一个瓶盖,先换回一瓶,喝完后再还回瓶盖,这样可以多喝1瓶.
- sum = kele + 1;
- } else if ((kele + shengyu) == 1 || (kele + shengyu) == 0) {
- // 当喝完后瓶盖数量等于0或者等于1的时候,没有办法交换,只能买几瓶就喝几瓶..
- sum = kele;
- }
- // 其他情况,返回sum.
- return sum;
- }
- }
复制代码
|