入学考试的第10题,感觉我的方法好笨啊,大家帮忙看看怎样可以变得简单一些。高手指点一下
第10题:28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?(需写出分析思路)
/ * 分析思路:(1)因为每买3瓶便可以兑换1瓶,相当于买3瓶够4个人喝。所以有: 3瓶 = 4人喝; 记为“买3瓶(解决4人喝,产生一个瓶盖)”。 (2)第4个人喝掉后又会产生一个瓶盖,当有3组“买3瓶”时,会帮助3个 第4人喝,产生3个瓶盖,即又可以使1个人喝, 此时,一共买了(3*3=9瓶)可以让(4*3+1=13人)喝,所以有: 9瓶 = 13人喝;记为“买9瓶(解决13人喝,产生一个瓶盖)”。
(3)同第二条,赠给的人还会产生瓶盖,当再产生3个瓶盖时,还可以兑换。故,当买3组“买9瓶”时,可以帮一个人喝, 此时购买了(3*9=27瓶)可以让(13*3+1=40人)喝,所以有; 27瓶 = 40人喝;记为“买27瓶(解决40人喝,产生一个瓶盖)”。
因为题目是买28瓶,或者50瓶,我们只需考虑上述3个等级便可。
* 程序先判断28人大于13人,小于40人,故买2组“买9瓶”可以直接解决26个人引用,同时产生2个瓶盖,
* 此时,第27人直接购买,再产生1个瓶盖,换1瓶解决第28人饮用。便可以,此时共买了(9*2+1=19瓶)
* 程序判断50人大于40人,故买1组“买27瓶”可以直接解决40人引用。同时产生 1 个瓶盖,
* 剩余 10人,小于13人,故用“买3瓶”解决。买两组“买3瓶”可以解决8人饮用,同时产生2个瓶盖,
* 此时,有3个空闲盖子,换一瓶,共饮用了(40+4*2+1=49人),第50人,需要自己购买。共买了(27+3*2+1=34瓶)。
*/
public class Test10 {
public static void main(String[] args){
//从键盘输入总人数
java.util.Scanner sc = new java.util.Scanner(System.in);
System.out.println("请输入总人数:");
int person = sc.nextInt();
//定义变量,最后总人数为sum
int sum = 0;
int a;
int b;
int c;
int d;
//分情况讨论,在4人及其以下的情况
if(person <= 3){
sum = person;
}else if (person == 4){
sum = 3;
}
//讨论4-13人的情况,用我们的“买3瓶”处理
else if (person >4 && person <13){
a =(int)person/4;
b =(int)person%4;
if(b == 2){
sum = 3*a + b -1;
}else
sum = 3*a +b;
}else if (person ==13){
sum = 9;
//讨论13-40人的情况,用我们的“买9瓶”处理大部分人
}else if (person >13 &&person <40){
a = (int)person/13 ;
b = person%13;
if(b== 0 || b ==1){
sum = a*9 +b;
}
if(b==2){
sum = a *9 + b -1;
}
if(b>=3){
//讨论剩余人数,用“买3瓶”模式去做
c=(int)b/4;
d=b%4;
if(d ==2){
sum =a*9 + c*3 +d -1;
}else
sum = a*9+c*3+d;
}
}else if(person ==40){
sum =27;
}
//讨论人数在40-121人时。大部分用“买27瓶”处理,其后依次再用“买9瓶”和“买3瓶”模式
else if(person >40 &&person< 121){
a = (int)person/40;
b = person%40;
if(b == 2){
sum = 27*a +1;
}
if(b>=3 &&b<13){//剩余人用“买3瓶”模式处理
c=(int)b/4;
d=b%4;
if(d ==2){
sum =a*27 + c*3 +d -1;
}else if(b>=13){}
//其后用“买9瓶”处理,再用“买3瓶”处理,暂时不做讨论
}
}
System.out.println(person + "个人需要买" + sum + "瓶可乐");
}
}
|
|