A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Five_伍 中级黑马   /  2015-8-21 00:01  /  1386 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Five_伍 于 2015-8-21 10:30 编辑

/*小明的妈妈每天会给他20元零花钱。平日里,小明先花掉一半,再把一半存起来。每到周日,小明拿到钱后会把所有零花钱花掉一半。请编程计算,从周一开始,小明需要多少天才能存够100元?*/
public class Test {
        public static void main(String[] args) {
                int saveMoney = 0;
                int count = 0;
                int day = 1;
                do {
                        saveMoney += 10;
                        count++;
                        if (day % 7 == 0) {
                                saveMoney /= 2;
                        }
                        day++;
                } while (saveMoney <= 100);
                System.out.println(count);

        }

}
如何进行优化,菜鸟一只希望能给出注释。

15 个回复

倒序浏览
本帖最后由 sunsteam 于 2015-8-21 00:58 编辑
  1. class Save
  2. {
  3.         private int money= 0;
  4.         private int day=0;

  5.         void saving()
  6.         {
  7.                 for (;money<100 ;)
  8.                 {
  9.                         day++;
  10.                         money+=20;
  11.                         if (day%7==0)
  12.                                 money>>>=1;
  13.                         else
  14.                                 money-=10;
  15.                 }
  16.                 System.out.print("小明用了"+day+"天存够了100元,他现在有"+money+"元。");
  17.         }
  18. }

  19. public class Test820
  20. {
  21.         public static void main(String[] args)
  22.         {
  23.                 new Save().saving();
  24.         }
  25. }
复制代码


用面向对象写的 你的代码 我运行了下 提3点  1. day一开始定义成1 第一天领完钱day++不是变周二结束了麽  
2. 先拿到20 如果是周日 所有钱用一半 不另存 不是周日 存10块  你这是每天拿10块 如果是周日 所有钱用一半 也就是说 用一半之前 你就少拿10块钱了
3. while定义成<=100 一天结束他有100了为什么还要循环  

逻辑上的问题就找到这3个  其他都是代码简化
回复 使用道具 举报
class Save
{
        void saving()
        {
                for ( int day=0,int money= 0;money<100 ;)
                {
                        day++;
                        money+=20;
                        if (day%7==0)
                                money>>>=1;
                        else
                                money-=10;
                }
                System.out.print("小明用了"+day+"天存够了100元,他现在有"+money+"元。");
        }
}

public class Test820
{
        public static void main(String[] args)
        {
                new Save().saving();
        }
}
这样把变量创建写在for循环里,可以节省内存
回复 使用道具 举报
本帖最后由 不想睡 于 2015-8-21 09:44 编辑

class Test {
        public static void main(String[] args) {
                int count =0;
                int money =0;
                while(true){
                        count++;
                        money+=10;
                                if(count%7==0){
                                money=(money+10)/2;
                        }
                                if(money>=100){
                                        break;
                                }
                }
                System.out.println(count);
        }
}
答案13天
回复 使用道具 举报
本帖最后由 Five_伍 于 2015-8-21 10:31 编辑
史柯 发表于 2015-8-21 08:19
class Save
{
        void saving()

非常感谢,。自己本身的逻辑就出错了,一开始不明白为什么要用位运算,后来才顿悟,位运算比算术运算符更快,占内存更少。
回复 使用道具 举报
class Demo {
        public static void main(String[] args) {
                int day = 0;
                for (int money = 0 ;money<100; ) {
                        day++;
                        if (day%7==0) {
                                money = (money+20)/2;
                        }
                        else {
                                money = money+10;
                        }
                }
                System.out.println(day);
        }
}
回复 使用道具 举报
sunsteam 发表于 2015-8-21 00:53
用面向对象写的 你的代码 我运行了下 提3点  1. day一开始定义成1 第一天领完钱day++不是变周二结束了麽 ...

非常感谢,。自己本身的逻辑就出错了,一开始不明白为什么要用位运算,后来才顿悟,位运算比算术运算符更快,占内存更少。开始回复错了,感觉楼下的有抄袭的嫌疑,。
回复 使用道具 举报
sunsteam 发表于 2015-8-21 00:53
用面向对象写的 你的代码 我运行了下 提3点  1. day一开始定义成1 第一天领完钱day++不是变周二结束了麽 ...

想问一下这局是什么意思啊  money>>>=1;
回复 使用道具 举报
史柯 中级黑马 2015-8-21 11:15:56
9#
boboyuwu 发表于 2015-8-21 11:09
想问一下这局是什么意思啊  money>>>=1;

money>>>=1;
计算机底层是换算成2进制运算等的
》》》1的意思是数字转换成2进制然后右移1位  即:除2
回复 使用道具 举报
boboyuwu 发表于 2015-8-21 11:09
想问一下这局是什么意思啊  money>>>=1;

money>>>=1  这是除以2
把数据向右移动,左边补0,其实就相当于除以2的移动位数次幂
如果是money>>>=n  如果是n的话就相当于除以 2的n次幂
回复 使用道具 举报
boboyuwu 发表于 2015-8-21 11:09
想问一下这局是什么意思啊  money>>>=1;

money=money>>>1  除以2

money =money>>>n  除以2的n次幂
回复 使用道具 举报
iamzk 中级黑马 2015-8-21 11:53:02
12#
应该是第13天
  1. class Save {
  2.         public static int save(int money) {
  3.                 int day = 0;
  4.                 int sum = 0;
  5.                 while(sum<money){
  6.                         day++;
  7.                         if(day % 7 == 0){
  8.                                 sum += 20;
  9.                                 sum /= 2;
  10.                         }
  11.                         else{
  12.                                 sum += 10;
  13.                         }
  14.                 System.out.println("第" + day + "天,零花钱:" + sum + "元");
  15.                 }
  16.                 return day;
  17.         }
  18. }
  19. class SaveTest {
  20.         public static void main(String[] args) {
  21.                 System.out.println("day=" + new Save().save(100));
  22.         }
  23. }
复制代码

截图20150821114812.jpg (81.81 KB, 下载次数: 18)

截图20150821114812.jpg
回复 使用道具 举报
史柯 发表于 2015-8-21 08:19
class Save
{
        void saving()

编译过么? 这样把变量定义在for循环里面  for语句结束变量就释放了  根本打印不出来
回复 使用道具 举报
Five_伍 发表于 2015-8-21 10:32
非常感谢,。自己本身的逻辑就出错了,一开始不明白为什么要用位运算,后来才顿悟,位运算比算术运算符更 ...

不客气 其实我觉得主要优化在面向对象
回复 使用道具 举报
sunsteam 发表于 2015-8-21 12:14
编译过么? 这样把变量定义在for循环里面  for语句结束变量就释放了  根本打印不出来  ...

那就在for循环里做个if语句
当遍历到最后一个的时候,输出就可以了
回复 使用道具 举报
Lemen 中级黑马 2015-8-22 21:30:11
16#
路过。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马