第37课 最小公倍数
最小公倍数(while循环、穷举、break)
奇异果精灵需要定期维护两台机器,一台时光机每10天需要维护一次,一台穿梭机每15天需要维护一次。有一天他同时维护了这两台机器,那么再过多少天,他需要同时维护两台机器呢?
可以通过计算两个维护时间的最小公倍数来确定。
一个数字既可以被10整除又可以被15整除,那这个数就是10和15的公倍数,所有公倍数中最小的那个数字就被称为10和15的最小公倍数。
最小公倍数
计算机厉害之处就是拥有超强的计算能力,如果想要找到两个数字的最小公倍数,可以借助计算机的计算能力,采用穷举的方式从1开始一个数字一个数字地尝试,直到找到正确的答案。

运行程序:
请输入第一个整数:7
请输入第二个整数:10
最小公倍数为:70
不断循环让变量lcm加1,通过if(lcm % num1==0 && lcm % num2==0)判断lcm是否可以同时被两个数字整除,如果满足if语句的条件,就执行break跳出循环。
划重点
break是C++语言中的一个控制语句,主要用于在循环中提前结束循环的执行。当程序执行到break语句时,它会立即跳出当前所在的循环
体,不再继续执行循环体内的后续代码,而是执行当前循环体外的下一行代码。


优化
没必要从1开始增加,最小公倍数至少比两个数的最大值要大或者相等。
可以直接从一个大数开始加1。
运行程序:
请输入第一个整数: 100
请输入第二个整数: 101
最小公倍数为: 10100
lcm=(num1>num2)? num1 : num2; //取两个数中的较大值
直接从大数开始累加,减少循环次数,提升了效率。

再优化
从大数开始,似乎也不需要+1、+1地进行。因为最小公倍数一定是两个数的倍数,那么必定是大数的倍数,直接基于大数1倍、2倍……地尝试是不是会更快。

(1)maxNum=(num1>num2)? num1 : num2:取出大数赋值给maxNum。
(2)lcm=maxNum*i:lcm按照大数的倍数增加,通过i++实现增加1倍、2倍……
(3)当lcm满足同时被这两个数整除时,此时的lcm就是这两个整数的最小公倍数了。


巩固练习
(1)break语句是必需的,否则每个while循环都无法终止。()√()×
(2)阅读下面的代码,在空格处补充代码,以输出最小公倍数。

(3)编程程序,输入两个分数,通过计算输出它们通分后的分母,以及通分后各自分子的值。
输入示例:
请分别输入两个分数的分子与分母:1 3 6 5
输出示例:
通分后的分母值为: 15
分数1通分后的分子值: 5
分数2通分后的分子值: 18