我们在敲代码的时候经常会遇到这样的问题,面对一道编程题,看着看着就在纸上列起了方程,,,然而计算机哪能给我们列方程!!我们要渐渐从以前上学学的数学解题思维中慢慢抽出来,一点一点地培养起我们的计算机的逻辑思维,我认为的最高境界就是——工具人!
为什么会有这番感慨,还是要从今天看到的非常简单的一道编程题,没有任何数组和集合等数据结构的内容,单单是一道一层的循环结构,我却默默地在纸上列起了方程,并没有计算机角度怎么解题,自此心中很是郁闷,开始怀疑自己的智商~ 哎没办法啊,什么事情刚开始不擅长了但是只要你肯慢慢积累,慢慢培养再难的事情也可以做到的。仅以此篇文章感怀一下,以后决心多敲代码,多像计算机的逻辑一样思考,解方程通过一步步迭代求解! 下面我们来看一下这道小题。
例题
有一个容量为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");
}
}
}