一道循环题引发的深思~

  我们在敲代码的时候经常会遇到这样的问题,面对一道编程题,看着看着就在纸上列起了方程,,,然而计算机哪能给我们列方程!!我们要渐渐从以前上学学的数学解题思维中慢慢抽出来,一点一点地培养起我们的计算机的逻辑思维,我认为的最高境界就是——工具人!


 为什么会有这番感慨,还是要从今天看到的非常简单的一道编程题,没有任何数组和集合等数据结构的内容,单单是一道一层的循环结构,我却默默地在纸上列起了方程,并没有计算机角度怎么解题,自此心中很是郁闷,开始怀疑自己的智商~ 哎没办法啊,什么事情刚开始不擅长了但是只要你肯慢慢积累,慢慢培养再难的事情也可以做到的。仅以此篇文章感怀一下,以后决心多敲代码,多像计算机的逻辑一样思考,解方程通过一步步迭代求解! 下面我们来看一下这道小题。

例题

    有一个容量为10L的空水桶。水桶的上面开始往里灌水,同时下面开始往出流水。
第一分钟灌水的速度是1L/min,第二分钟灌水的速度是2L/min,第三分钟灌水的速度是3L/min,以此类推。
而流水的速度固定是3L/min。那么几分钟之后,水桶里能保持灌满水的状态?

  当我第一眼看到这个题,并没有像平常那样打开 IDEA ,啪啪敲了起来,而是默默拿起笔在纸上列出了方程。

	设用了 m 分钟,
	(1 + 2 + 3 + 4 +···+ m) - 3 * m = 10

  哎,脑袋里根本没一点迭代的思想,如果我们把自己想象成计算机,会怎么处理这个问题呢?

第一分钟: 1 - 3;
第二分钟: 2 - 3;
第三分钟: 3 - 3;
第四分钟: 4 - 3;
···········

  如果我们有上面类似的思路,我们就知道自己要做什么了,定义一个变量代表分钟数,然后不断以一为步长递增,定义一个 sum 变量代表水桶里的水量,将各个分钟时刻的相对增加水量累加起来,我们知道我们要用 循环结构 了,而且不知道进行多少次所以要用 while 循环结构,判断条件是什么呢?(是sum判断还是分钟判断呢?) 各个时刻水量怎么计算呢? 有没有需要注意的地方呢?这些问题接踵而来,我们脑子瞬间一副清晰的脉络呈现出来,啪啪几行,快捷的集成开发环境就帮我们写好了代码。

    public static void main(String[] args) {
        int min = 0;  // 定义所用分钟数
        int sum = 0;  //定义水桶水量

        while (sum < 10) {
            min++;  // 分钟数增加
            sum += min - 3;
            // 桶里的水不能是负数
            if (sum < 0) {
                sum = 0;
            }
        }
        System.out.println("一共用了" + min + "分钟。");
    }

  是不是看起来非常简单,我都想打死我自己,这么简单的题还要拿出来显摆,?? 没办法,谁让这道题伤了我的心呢~ (注意!!这道题不像一般循环那样直接递增的为判断条件,这里是要通过 min 的递增来计算 sum,要通过 sum 来判定循环成立)
  这告诉我们编程思维的培养是很重要的,让我们多思考,多实践,能想到计算机的逻辑,慢慢成长起来把。

补充

补一下今天学到的一个新名词吧,“水仙花数”。

  • 什么是水仙花数?
    • 一个三位数,个位、十位、百位的数字立方和等于原数
    public static void main(String[] args) {
    /*题目:
     获取所有的三位数,准备进行筛选,最小的三位数为100,最大的三位数为999,求所有的水仙花数并输出
    */
        System.out.print("水仙花数有:");
        for (int i = 100; i <= 999; i++) {
            // 先找出三位数的个位,个位,百位。

            // 1.提取个位数
            int ge = i % 10;  // 可以这样想 760 可以被 10 整除,剩下余数就是个位数
            // 2.提取十位数
            int shi = (i / 10) % 10;  //除以10后为 76 ,再除以10求余就是十位数
            // 3.提取百位数
            int bai = i / 100; // 除以100 直接就是整数7.

            // 判断当前数字的个位,十位,百位,看其各自的立方和的总和是否等于其本身。是则说明该数字是水仙花数
            if (ge * ge * ge + shi * shi * shi + bai * bai * bai == i) {
                System.out.print(i + "\t");
            }
        }
    }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值