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
結語:以上就是我對這個問題的理解、解法,可能存在着更好、更簡潔的解法代碼,希望大家提出來,我們一起討論,交換看法,共同進步。若上述代碼中存在問題,望大家指正,謝謝大家。(∩^∩)