藍橋杯:矩形切割問題(C++)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章