藍橋杯 2019 Java C 矩陣分割 帶原理解析

藍橋杯 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,所以不會造成干擾

代碼

public class 矩陣分割 {
	static int count=0;
	public static void main(String[] args) {
		int n =2019;int m =324;
		gcd(n,m);
		System.out.println(count);
	}
	public static int gcd(int n ,int m) {
		if(m!=0)count+=n/m;
		return m==0? n:gcd(m,n%m);
	
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章