黑马程序员技术交流社区

标题: 28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶... [打印本页]

作者: furuigang    时间: 2016-1-23 23:43
标题: 28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶...
本帖最后由 furuigang 于 2016-1-24 22:33 编辑

看到这样一道题目,顺手就做了下分享给大家。众位大神多多指教。求不打,求轻虐~还是以前的习惯,代码加截图,希望大家一起交流!


题目:
28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?
假如是50人,又需要买多少瓶可乐?(需写出分析思路)


分析思路
    A:要买够多少人喝,先一瓶一瓶的买,边买边换,直到可乐总数满足所有人喝为止
    B:可以设可乐总数为 sum,购买的瓶数用 count 来计数
    C:每购买一瓶 count 自加一,可乐总数 sum 也加一
    D:购买瓶数 count 达到三的倍数时,就可以用瓶盖再换一瓶,即总数 sum 加一
    E:按以上规律做一个循环,当可乐总数 sum 满足所有人需要时跳出循环
    F:此时的 count 值即为需要购买的瓶数


代码如下:
public class Test10 {
        public static void main(String[] args) {
                System.out.println("28人买可乐喝,需要买" + getNum(28) + "瓶可乐");
                System.out.println("50人买可乐喝,需要买" + getNum(50) + "瓶可乐");
        }
        public static int getNum(int num) {
                int sum = 0;//用于记录当前可乐总数
                int count = 0;//用于记录购买的可乐数
                while (sum < num) {
                        count++;
                        if(sum % 3 == 0)
                                sum++;
                        sum++;
                }
                return count;
        }
}




代码.png (174.7 KB, 下载次数: 100)

代码.png

作者: 舞动炫龙    时间: 2016-1-23 23:51
赞一个  ,很好
作者: furuigang    时间: 2016-1-23 23:53
舞动炫龙 发表于 2016-1-23 23:51
赞一个  ,很好

多谢支持!
作者: wuzeshui    时间: 2016-1-23 23:54
黑马币竟然都这么多了
作者: wuzeshui    时间: 2016-1-23 23:56
刚刚光看你黑马币了,题也不错
作者: furuigang    时间: 2016-1-23 23:58
wuzeshui 发表于 2016-1-23 23:56
刚刚光看你黑马币了,题也不错

黑马币刚刚送出了18个……现在的我也只是穷人一人,不开心
作者: 梁志斌    时间: 2016-1-24 00:13
我也来分享下我的思路~~
  1. public class Test9 {
  2.         public static void main(String[] args) {
  3.                 while(true){
  4.                         System.out.println("----------------------------------------------");
  5.                         System.out.println("请输入要喝可乐的人数:");
  6.                        
  7.                         Scanner sc = new Scanner(System.in);  
  8.                         int pep = sc.nextInt();                        //键盘录入获取人数
  9.                
  10.                         if (pep>=998) {
  11.                                 System.out.println("贩卖可乐计算器炸了 0v0 ");
  12.                                 break;
  13.                         }
  14.                         System.out.print(pep+"人需要买");
  15.                         cola(pep);
  16.         }}
  17.        
  18.         private static void cola(int pep){  //明确喝可乐的人数=输入的人数
  19.                 int cap = 0;                                         //瓶盖数量
  20.                 int buy = 0;                                          //买可乐的人数
  21.                
  22.                 while(pep!=0){                                  //每有一个人喝到可乐,需要喝的人就自动减一,直至全体都喝到为止
  23.        
  24.                         if (cap<3) {                                //判断瓶盖满不满足3个,不满足,则买一瓶,买了就喝了
  25.                                 buy++;
  26.                                 cap++;
  27.                                 pep--;
  28.                         }
  29.                        
  30.                         if (cap==3) {                                //当瓶盖为3时,换到一瓶(瓶盖为1),给后面的逗比喝了
  31.                                 cap=1;
  32.                                 pep--;
  33.                         }
  34.                 }
  35.                 System.out.print(buy+"瓶可乐"+"\r\n");
  36.         }
  37. }
复制代码

作者: fury1994    时间: 2016-1-24 00:47
赞~~~~~~~~~
作者: fury1994    时间: 2016-1-24 00:48
赞~~~~~~~~~
作者: furuigang    时间: 2016-1-24 14:02
fury1994 发表于 2016-1-24 00:47
赞~~~~~~~~~

多谢支持
作者: furuigang    时间: 2016-1-24 14:05
梁志斌 发表于 2016-1-24 00:13
我也来分享下我的思路~~

不错不错,赞赞!
作者: wuzeshui    时间: 2016-1-24 16:52
furuigang 发表于 2016-1-23 23:58
黑马币刚刚送出了18个……现在的我也只是穷人一人,不开心

有没有听说过滴水之恩当涌泉相报?当初为了帮你完成目标,我送了你几个黑马币,现在是不是应该也多返还我一点?
作者: Mayer    时间: 2016-1-24 17:09
好人~~~~~
作者: furuigang    时间: 2016-1-24 20:03
wuzeshui 发表于 2016-1-24 16:52
有没有听说过滴水之恩当涌泉相报?当初为了帮你完成目标,我送了你几个黑马币,现在是不是应该也多返还我 ...

那你有没有听说过“施恩不图报”?
作者: furuigang    时间: 2016-1-24 20:04
Mayer 发表于 2016-1-24 17:09
好人~~~~~

请叫本王子雷锋谢谢!
作者: 549208564    时间: 2016-1-24 20:19
你这个答案有问题,28个人19瓶就可以了,这下面的代码有点丑,不过可以修改一下,应该可以

public class Test9 {
        public static void main(String[] args) {
                //先定义一个人数,可以使用一个方法,传入人数
                coke(28);
        }
        public static void coke(int number ){
               
                //设置需要买可乐的数量为x,最大买写人数相等的数量
                f:for(int x=0;x<=number;x++){
                        //定义一个变量,得到当前数的余数
                        int yu=0;
                        //定义一个变量,得到每次可以得到换多少瓶可乐
                        int zhu=0;
                        //定义一个变量,用来计算总共可以得到多少瓶可乐
                        int num=0;
                        yu=x%3;
                        zhu=x/3;
                        num=x+zhu;
                        //这里的判断条件为,当除数写余数加起来还小于3,数量也没有等于与人数相同,那么就没必要进行循环了,进行下一个数的循环
                        while((zhu+yu)>2){
                                //定义一个变量,用来计算每次的余数与除数的和
                                int tem=0;
                                tem=zhu+yu;
                                //每次都用tem除3或模3取余,得到的数分别给除数写余数
                                zhu=tem/3;
                                yu=tem%3;
                                //将每次的除数相加,并加上当前的数x,得到与人数相等的数时,跳出循环,并得到当前的x数
                                num+=zhu;
                                if(num==number){
                                        System.out.println("需要买:"+x+",就可以得到:"+num);
                                        break f;
                                }
                        }
                        if(num==number){
                                System.out.println("需要买:"+x+",就可以得到:"+num);
                                break f;
                        }
                }
        }
}

作者: furuigang    时间: 2016-1-24 20:31
549208564 发表于 2016-1-24 20:19
你这个答案有问题,28个人19瓶就可以了,这下面的代码有点丑,不过可以修改一下,应该可以

public class T ...

你说“28个人19瓶就可以了”,那你这么算算,28个人,买19瓶可乐,按照每3个可乐瓶盖换取一瓶可乐的原则兑换的话,19个可乐瓶盖最多换几瓶可乐?  19 / 3 = 6;  19 + 6 = 25,25 < 28 ,你算算,19瓶可乐够 28 个人喝的吗?
作者: wuzeshui    时间: 2016-1-24 20:57
furuigang 发表于 2016-1-24 20:03
那你有没有听说过“施恩不图报”?

貌似没有
作者: 姚成晖    时间: 2016-1-24 21:41
本帖最后由 我是坏人, 于 2016-1-24 22:10 编辑

挺棒~不过稍微有点小问题,3个盖子换一瓶可乐 ,喝完之后 还会有一个盖子呢
作者: 姚成晖    时间: 2016-1-24 22:02
本帖最后由 我是坏人, 于 2016-1-24 22:11 编辑

  1. import java.util.Scanner;

  2. public class Demo {
  3.         /**
  4.          *         28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,
  5.                  * 够28人喝?假如是50人,又需要买多少瓶可乐?
  6.                  (需写出分析思路)
  7.                  分析:  1.键盘录入您需要喝的可乐数
  8.                           2.定义变量 lid   存储盖子数
  9.                           3.定义变量Count  存储需要购买的可乐数
  10.                           4.因为不知道买多少瓶就够喝了,循环次数不确定,所以用while循环
  11.                                                 
  12.          * */
  13.         public static void main(String[] args) {
  14.                 Scanner sc = new Scanner(System.in);
  15.                 System.out.println("请输入您要喝的可乐数");
  16.                 int sum = sc.nextInt();
  17.                
  18.                 int count=0;                        //统计需要购买的可乐数量
  19.                 int lid=0;                        //2.存储盖子数
  20.                
  21.                
  22.                 while(lid!=sum){        //假如瓶盖等于您要喝的可乐数,说明您已经够喝了.
  23.                         count++;                //购买一瓶可乐
  24.                         lid++;                        //喝完后多一个盖子
  25.                         if(lid%3==0){        //假如盖子是3的倍数,就换购一瓶可乐.喝完后盖子又多一个
  26.                                 lid++;
  27.                         }
  28.                 }
  29.                 System.out.println(count);  //输出需要购买的盖子数
  30.         }
  31. }
复制代码

作者: furuigang    时间: 2016-1-24 22:27
我是坏人, 发表于 2016-1-24 21:41
挺棒~不过稍微有点小问题,3个盖子换一瓶可乐 ,喝完之后 还会有一个盖子呢 ...

嗯  好  反应过来了 多谢
作者: furuigang    时间: 2016-1-24 22:31
furuigang 发表于 2016-1-24 20:31
你说“28个人19瓶就可以了”,那你这么算算,28个人,买19瓶可乐,按照每3个可乐瓶盖换取一瓶可乐的原则 ...

嗯  好  反应过来了 多谢
作者: furuigang    时间: 2016-1-24 22:36
我是坏人, 发表于 2016-1-24 22:02

我自己的代码只要修改一个小地方就好了,帖子已更新,多谢大神不吝赐教!
作者: furuigang    时间: 2016-1-24 22:37
furuigang 发表于 2016-1-24 20:31
你说“28个人19瓶就可以了”,那你这么算算,28个人,买19瓶可乐,按照每3个可乐瓶盖换取一瓶可乐的原则 ...

我自己的代码只要修改一个小地方就好了,帖子已更新,多谢大神不吝赐教!
作者: liuxiaoman1    时间: 2016-3-6 00:45
学习了,辛苦~~
作者: 执剑人    时间: 2016-3-6 09:53
本帖最后由 执剑人 于 2016-3-6 09:59 编辑

用递归做很简单的!为什么不用递归的思想?如果有更好的方法欢迎告知public static void main(String[] args) {
                int num = 28;                                //num来记录人数。
                int i = 0;
                while(getp(i) + i < num){
                        i++;
                }
                System.out.println(i);
        }

        public static int getp(int i){    //传入瓶盖值返回可乐值
                if(i > 3){
                        
                        return  i/3 + getp(i / 3  + i % 3);        //把产生瓶盖传回去!递归!
                }else{
                        return 0;
                }
        }

//最后能送我点黑马币么?我马上去就业班了,技术分还差很多!兄弟我会记得你的!

作者: 15617883302    时间: 2016-3-6 10:14
549208564 发表于 2016-1-24 20:19
你这个答案有问题,28个人19瓶就可以了,这下面的代码有点丑,不过可以修改一下,应该可以

public class T ...

赞一个!!!
作者: qq812392675    时间: 2016-3-6 16:07
public class Pinggai {
//只要不是28就让他循环
        public static void main(String[] args) {
                int ci=28;
                int i =0;
                for(int num=1;;num++){
                i=num;
                int max=num/3;
                num+=num%3;
                while(max >3){
                        num+=max/3;
                        num+=max%3;
                        max=max-max/3-max%3;
                }
                num+=num%3;
                if(num==ci){
                        System.out.println("共需要"+i+"次");break;}
                else{num=i;}
                }
        }
}
作者: qq812392675    时间: 2016-3-6 16:12
public class Pinggai {
//只要不是28就让他循环
        public static void main(String[] args) {
                int ci=28;
                int i =0;
                for(int num=1;;num++){
                i=num;//把可能的的制赋给i
                int max=num/3;
                num+=num%3;
                while(max >3){//如果是大于三说明还可以循环
                        num+=max/3;
                        num+=max%3;
                        max=max-max/3-max%3;
                }
                num+=num%3;
                if(num==ci){//如果是正确的就输出i这个数
                        System.out.println("共需要"+i+"次");break;}
                else{num=i;}//否则把num值归回当下循环次i制
                }
        }
}


作者: qq812392675    时间: 2016-3-6 16:13
qq812392675 发表于 2016-3-6 16:12
public class Pinggai {
//只要不是28就让他循环
        public static void main(String[] args) {

思路不太清晰不过还是写出哦来了
作者: skykiah    时间: 2016-3-6 17:08
新人 表示看不懂
作者: q6619866    时间: 2016-3-16 02:29
刚看完java基础视频前四天,方法不太熟练,也就不用了,半个小时多点敲出来的,不足之处望希望能指点出来.
  1. /*
  2. 题目:
  3. 28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?
  4. 假如是50人,又需要买多少瓶可乐?(需写出分析思路)

  5. 分析:
  6. 1,定义一个变量count,等于需要喝可乐的人数
  7. 2,定义一个变量temp,等于能兑换的可乐数量
  8. 3,每三瓶能兑换一瓶,可以当作条件,循环次数 % 3 = 0的时候,则temp自增
  9. 4,人数减去能兑换的可乐数量就是实际购买的可乐瓶数
  10. */
  11. import java.util.Scanner;                                                                       
  12. class Test1 {
  13.         public static void main(String[] args) {
  14.                 Scanner sc = new Scanner(System.in);                               
  15.                 System.out.println("请输入需要喝可乐的人数:");
  16.                 int count = sc.nextInt();
  17.                 int temp = 0;
  18.                 int i = 0;
  19.                 for (i = 1;i <= count ;i++ ) {
  20.                         if (i % 3 == 0) {
  21.                                 temp +=1;
  22.                         }
  23.                 }
  24.                 int sum = count - temp;
  25.                 System.out.println(count + "人需要购买" + sum + "瓶");
  26.         }
  27. }
复制代码




作者: lgdbest    时间: 2016-3-16 23:03
精髓。。。新手研究了半天才懂,求轻喷。
作者: lgdbest    时间: 2016-3-16 23:06
厉害,很精髓,看半天终于看懂了
作者: furuigang    时间: 2016-4-1 10:24
lgdbest 发表于 2016-3-16 23:06
厉害,很精髓,看半天终于看懂了

好好加油  这些都只是小意思而已  
作者: feng9639    时间: 2016-4-1 11:51
赞一个,666666
作者: 淡然无味    时间: 2016-4-1 13:47
思路很清晰,代码很简洁,点个赞
作者: 淡然无味    时间: 2016-4-1 14:09
稍微改进了一下

  1. import java.util.Scanner;

  2. class KeLei{
  3.         public static void main(String[] args){
  4.                 Scanner scan = new Scanner(System.in);
  5.                 System.out.print("请输入总人数:");
  6.                 int num = scan.nextInt();
  7.                 System.out.println("需要购买的可乐总数为:"+count(num));
  8.         }

  9.         public static int count(int men){
  10.                 //按人头算的存放需要购买的可乐总数
  11.                 int sum = 0;
  12.                 //存放需要额外购买的可乐
  13.                 int buy = 0;
  14.                 while (sum<men){
  15.                         sum++;
  16.                         //每三瓶就可以额外购买一瓶可乐
  17.                         if (sum%3==0){
  18.                                 buy++;
  19.                         }
  20.                 }
  21.                 //两者差就是需要的可乐
  22.                 return sum-buy;
  23.         }
  24. }
复制代码

作者: 暴雨    时间: 2016-6-21 23:56
{:2_31:}学习了
作者: 火影木叶    时间: 2016-6-22 00:12
这个很贴合实际嘛




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2