黑马程序员技术交流社区

标题: 一个卖西瓜的程序 [打印本页]

作者: 吴扬    时间: 2012-6-21 01:21
标题: 一个卖西瓜的程序
本帖最后由 吴扬 于 2012-6-22 00:42 编辑

学习完for循环,在一些资料上找了一些练习:有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问几天以后能卖完。
下面是我自己写的代码:

  1. public class SaleWaterMelon {
  2. public static void main(String[] args) {
  3. saleWaterMelon();
  4.         }
  5.         public static void saleWaterMelon()
  6.         {
  7.                 int sum = 1020;
  8.                 int day = 0;
  9.                 while(sum > 0)
  10.                 {
  11.                         sum = sum - (sum/2 +2);
  12.                         System.out.println(sum);
  13.                         day++;
  14.                 }
  15.                 System.out.println(day);
  16.         }
  17. }
复制代码
运行的结果是8天,下面是正确的代码:
  1. public class Prog1 {
  2.         public static void main(String[] args) {
  3.                 int last=0;
  4.                 last=1020/2+2;
  5.                 int i=0;
  6.                 for(i=1;last>=0;i++)
  7.                 {
  8.                         last=last-(last/2+2);
  9.                 }
  10.                 System.out.print("需要的天数:"+i);
  11.         }
  12. }
复制代码
运行出来的结果确实9天,看了很久也没发现错误在哪。希望大家能帮我查看下吗?谢谢!

作者: 余银桂    时间: 2012-6-21 01:23
本帖最后由 余银桂 于 2012-6-21 02:13 编辑

我的答案也是八天
  1. public class Test {
  2.          
  3.     public static void main(String[] args) {

  4.             int last=0;

  5.             last=1020/2+2;   //这里应该修改 与题目不符 第一天剩下的应该是 last = 1020/2-2;

  6.             int i=0;

  7.             for(i=1;last>=0;i++)     //这里条件不满足后 i++了一次
  8.             {
  9.                     System.out.println(last);
  10.                     last=last-(last/2+2);
  11.   

  12.             }

  13.             System.out.print("需要的天数:"+i);  //所以这里得到的是 9天

  14.     }

  15. }



复制代码

作者: 丁二跃    时间: 2012-6-21 01:32
本帖最后由 丁二跃 于 2012-6-21 01:37 编辑

  1. public class Hello {
  2. public static void main(String[] args) {
  3. saleWaterMelon();
  4.         }
  5.         public static void saleWaterMelon()
  6.         {
  7.                 int sum = 1020;
  8.                 int day = 1;
  9.                 while(sum > 0)
  10.                 {
  11.                         sum = sum - (sum/2 +2);
  12.                         System.out.println(sum);
  13.                         if(sum<=0)break;;//这里当你最后一天西瓜数已经是0了,虽然不会进入下次循环但是本次循环将继续执行天数将加1.所以应该加上判断

  14.                         day++;
  15.                 }
  16.                 System.out.println(day);
  17.         }
  18. }
复制代码

作者: 丁二跃    时间: 2012-6-21 01:34
丁二跃 发表于 2012-6-21 01:32

不太准确,这里判断条件应该是:sum<=0
作者: 王晓新    时间: 2012-6-21 01:35
本帖最后由 王晓新 于 2012-6-21 01:44 编辑

你的程序我运行出来是9天啊


刚才没看出来,正确结果应该是8天卖完
  1. public class SaleWaterMelon {
  2.         public static void main(String[] args)
  3.         {
  4.                         saleWaterMelon();
  5.     }
  6.         public static void saleWaterMelon()
  7.         {
  8.                         int sum = 1020;
  9.                         int day = 1;
  10.                         while(sum > 0)
  11.                         {
  12.                                         sum = sum - (sum/2 +2);
  13.                                         if(sum<=0)//只需要在这里加一条判断语句即可,不满足条件就跳出循环!
  14.                                                 break;
  15.                                         day++;
  16.                         }
  17.                         System.out.println(day);
  18.         }
  19. }
复制代码

作者: 李元峰    时间: 2012-6-21 01:41
package javatext;

public class SaleWaterMelon {
    public static void main(String[] args) {
    saleWaterMelon();
            }
            public static void saleWaterMelon()
            {
                    int sum = 1020;
                   int day = 0;
                    while(sum > 0)
                    {
                            sum = sum - (sum/2 +2);
                            System.out.println(sum);
                            day++;
                    }
                    System.out.println(day);
            }
    }
这个结果是8 天
看标注红色的部分,你还没有开始卖的时候就已经添加 加一了 是不是提前了呢?


作者: 李文龙    时间: 2012-6-21 01:52
下面的程序是错的,错误之处为  last=1020/2+2;   你想想这是什么,这是第一天卖的西瓜数目,也就是512个,对吧,而下面的for循环里面   last=last-(last/2+2);  这个是求还剩下多少个西瓜数目,那么,请问第一天卖了512个,还剩多少个,是508个,而for循环进行第一次的时候,last值为512,这跟题意不符,应该为508才对,我将    last=1020/2+2;   改为 last=1020/2-2;  程序运行,输出结果为 8天。




作者: 王明明    时间: 2012-6-21 09:33
本帖最后由 王明明 于 2012-6-21 09:59 编辑
  1. public class Prog1 {
  2.         public static void main(String[] args) {
  3.                 int last=0;
  4.                 last=1020/2+2;//这里我觉得有问题 last应先赋值1020吧
  5.                 int i=0;
  6.                 for(i=1;last>=0;i++)
  7.                 {
  8.                         last=last-(last/2+2);                 }
  9.                 System.out.print("需要的天数:"+i); //这里 for会在运行程序完了 i++ 但是你是从1开始加的 卖了8天的话 就等8+1=9天
  10.         }
  11. }
复制代码
这是我改的
  1. public class Democeshi {
  2.         public static void main(String[] args) {
  3.                 int last=1020;
  4.                 int i=0;
  5.                 for(i=0;last>0;i++)
  6.                  {
  7.                         last=last-(last/2+2);
  8.                 System.out.println(last);//可以看到每天卖剩下的西瓜 明了便于分析
  9.                 }
  10.                 System.out.print("需要的天数:"+i);
  11.         }
  12. }
复制代码

作者: 黑马_张佳超    时间: 2012-6-21 10:08

  1. public class SaleWaterMelon {

  2. public static void main(String[] args) {

  3. saleWaterMelon();

  4.         }

  5.         public static void saleWaterMelon()

  6.         {

  7.                 int sum = 1020;

  8.                 int day = 0;

  9.                 while(sum > 0)

  10.                 {

  11.                         sum = sum - (sum/2 +2);

  12.                         System.out.println(sum);

  13.                         day++;

  14.                 }

  15.                 System.out.println(day);

  16.         }

  17. }
复制代码
楼主,你的代码是对的。
下边for循环中的判断条件有问题:for(i =1 ; i > 0 ; i++)
作者: 燃烧端午    时间: 2012-6-21 10:34
修改过的
  1.   public static void main(String[] args) {
  2.               // int last=0;
  3.                int last=1020;
  4.                 int i=0;
  5.                 for(i=1;last>0;i++)//last等于零就跳出循环,
  6.                 {
  7.                         System.out.print("第"+i+"天还有"+last+"个西瓜       ");
  8.                         System.out.println("第"+i+"天买掉"+(last/2+2)+"个");
  9.                     last=last-(last/2+2);
  10.                  if(last==0){
  11.                          System.out.print("需要的天数:"+i); //这样写就避免最后i++了
  12.                 }
  13.                 }
  14.                
  15.         }
复制代码
第1天还有1020个西瓜       第1天买掉512个
第2天还有508个西瓜       第2天买掉256个
第3天还有252个西瓜       第3天买掉128个
第4天还有124个西瓜       第4天买掉64个
第5天还有60个西瓜       第5天买掉32个
第6天还有28个西瓜       第6天买掉16个
第7天还有12个西瓜       第7天买掉8个
第8天还有4个西瓜       第8天买掉4个
需要的天数:8
这样看着不会迷糊
作者: 庄星睿    时间: 2012-6-21 12:03
先分析一下
卖掉西瓜数             剩余西瓜数    天数
             1024                0                 0  //注意不存在第0天的情况
510+2= 512                508               1
             256                 252               2
             128                 124               3
             64                    60                4
             32                     28               5
             16                     12               6
              8                        4                7
               4                      0                 8
这样就比较清楚了剩余的西瓜数可以作为变量lastSum存在,而第一天就已经卖掉了512个,起始剩余数就是508个了,天数从1开始,就两个变量ok
我用了两种方法,实际上这里用while更好一些,代码更简单一些
  1. class SailTest
  2. {
  3. public static void main(String[] args)
  4. {
  5. System.out.println(sailMelon(1020));
  6. System.out.println(sailMelon_2(1020));

  7. }

  8. public static int sailMelon(int num)
  9. {
  10. int lastSum=num;   //定义剩余西瓜数
  11. int getDay=1;   //西瓜卖的天数
  12. while((lastSum=(lastSum-(lastSum/2+2)))>0)  //只要剩余西瓜数大于0即可
  13. {
  14. getDay++;
  15. }
  16. return getDay;
  17. }

  18. public static int sailMelon_2(int num)
  19. {
  20. int lastSum=num;   //定义剩余西瓜数
  21. int day=1;    //西瓜卖的天数
  22. for (lastSum=lastSum-(lastSum/2+2);lastSum>0;)
  23. {
  24. day++;
  25. lastSum=lastSum-(lastSum/2+2);

  26. }
  27. return day;
  28. }

  29. }
复制代码

作者: 吴扬    时间: 2012-6-22 00:40
本人觉得也是答案除了问题,用笔算了下,确实是第8天就卖完了,谢谢大家的解答了!
作者: 何旭栋    时间: 2012-6-22 01:14
for(i=1;last>=0;i++)
i 初始化有问题,天数应该由0开始
当 i==8 时刚好卖完西瓜,这时候运行一次 i++,接着判断last>0符合,退出循环,但这时候i已经是9了




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