1、问题描述
小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。
当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正方形,剩下一块矩形,然后再切割剩下的矩形材料,直到全部切为正方形为止。
例如,对于一块两边分别为 5 和 3 的材料(记为 5×3),小明会依次切出 3×3、2×2、1×1、1×1 共 4 个正方形。
现在小明有一块矩形的材料,两边长分别是 2019 和 324。请问小明最终会切出多少个正方形?
2、我对这个问题的理解
这个问题是要求我们模拟长方形切割的过程,最终完成把一个长方形切割成若干个正方形,并得到正方形的总个数。问题的关键就是如何保证每次切割的都是正方形,还有切割结束的条件判断。
3、解题思想
(1)首先是模拟切割过程,可以通过用长方形的长a去减去宽b,实现把一个长方形切割成一个长方形和一个正方形,其中切割得到的长方形的长为b,宽为a-b;得到的那个正方形边长为b(最大的);
(2)然后是切割结束条件的判断,在上述模拟切割的过程中长方形的长和宽在不断地变化,但当长和宽相等的时候就表明该次切割得到的是两个正方形,即切割结束。
4、注意点
(1)在切割的过程中,要保证动态变化的长方形的长一定要大于宽,不然会发生错误。
实现方法:在每次切割之前进行一次长和宽的比较。
(2)统计图形个数的计数因子num的初值应是1,因为图形在切割之前的个数也算图形的一个个数,然后每次切割,num加1。
5、实现代码
#include<iostream>
#include<cmath>
using namespace std;
int calculate(int a,int b) //定义计算正方形个数的函数calculate(),参数为起始长方形的长和宽;
{
int num=1; //定义统计图形个数的变量num,并赋初值为1;
while(a!=b){ //当长和宽相等时,表明当前的图形为正方形,即切割街结束;
if(a<b){ //判断此时长和宽,保证长大于宽,应为下面要用长减去宽(模拟切割过程);
swap(a,b); //交换函数;
}
a=a-b; //模拟切割的过程:长减去宽得到一个边长为b的正方形和一个长为b宽为a-b的长方形;
num++; //每切割一次,计数因子num加1;
}
return num; //最后,函数返回总的正方形的个数;
}
int main()
{
int length=2019,width=324; //定义题目所需的长和宽;
cout<<calculate(length,width); //调用calculate()函数计算;
return 0;
}
6、运行截图
(1)长为5,宽为3
(2)长为2019,宽为324
结语:以上就是我对这个问题的理解、解法,可能存在着更好、更简洁的解法代码,希望大家提出来,我们一起讨论,交换看法,共同进步。若上述代码中存在问题,望大家指正,谢谢大家。(∩^∩)