蓝桥杯 2019 Java C 矩阵分割
题目
小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。
当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正方
形,剩下一块矩形,然后再切割剩下的矩形材料,直到全部切为正方形为止。
例如,对于一块两边分别为5 和3 的材料(记为5 X 3),小明会依次切出
3 X 3、2X 2、1 X 1、1 X 1 共4 个正方形。
现在小明有一块矩形的材料,两边长分别是2019 和324。请问小明最终会
切出多少个正方形?
思路
一句话。欧几里得算法,在迭代相除的倍数,就是切割出去的正方形
你应该会和我一样懵逼,什么是欧几里得算法,具体请百度。
说白了就是,一个axb 的矩形不断的切除掉 min{a,b}*min{a,b}个矩形。切到 长或宽中有一个小于min{a,b},
理解不了就画图试验一下。
在此之后,就不能继续切边长为min{a,b}的矩形了。 剩下的情况可能是a,a%b,或b,b%a的情况,这主要取决于
谁小。
这样子切割下去,直到切割到1或 一条边是另外一条边的倍数的情况,如果成倍数,就直接a/b 便是能切出来的个数。
不成倍数,则切的是最小边。
根据取模运算的规则,我们可以知道 如果a比b小,那么递归进入下一次 实际上是交换了 a,b的位置。 因为a%b=a,b放
在了a,这个时候直接用除法得到是0,所以不会造成干扰
代码