2013-05-25 56 views
-4

我需要計算矩形區域的兩個整數邊。
換句話說,我需要找到兩個整數乘以數字X,從數字X.從區域計算矩形邊的最快方法?

這是我在GML中編寫的代碼(即使您不知道該語言,是很容易理解的):

px = rectangleArea; 
height = sqrt(px); 
fheight = floor(height); 
n = 0; 
while (floor(px/height) != px/height) { 
    height = fheight - n; 
    n += 1; 
} 
width = px/height; 

它所做的是用「蠻力」,這由它劃分的區域給出了另一個整數,從該地區的截四角根開始,用數字下降至1,號碼的整數找到。 (我甚至不知道平方根的東西是否有意義)

這段代碼可能適用於小數字,但我需要使用數字> 10^6,並且它將花費該循環的時間完成。

我知道這將需要一段時間,但我能以更有效的方式實現嗎?

謝謝你的建議!

(GML,Java和C++應該罰款語言在回答使用,但我寧願像一個解釋:)

編輯:

好了,所以這裏的問題是,矩形的儘可能接近正方形。

+3

1.找出數字的主要因素。 2.乘以素數因子,直到只剩下兩個數字。 –

+0

你想要最矩形或矩形的矩形嗎? –

+0

如果矩形是最像方形的那樣會更好 –

回答

1

你的代碼實際上可能不是正確的,你有沒有測試過它?無論如何,一些修改,使其稍微比較有效:

px = rectangleArea; 
height = floor(sqrt(px)); 
n = 0; 
while (height != 0 && px % height != 0) { //short-circut avoiding div by zero 
    height -= 1; 
} 
if (height == 0) throw NotFoundException; 
width = px/height; 
assert(width % 1 == 0) //or however you check that width is an integer here... 

,你有height -= n; n += 1;的一部分,我敢肯定其實是錯誤的,因爲這會增加遞減每一步的金額,而你真正需要遞減當高度接近0時,減少

+1

OP沒有'height - = n'。這是'高度= fheight - n',其中'fheight'是恆定的。 – JJJ

+0

感謝您的迴應,出於某種原因,我沒有想到模塊。 無論如何,我的代碼工作正常,只是使用比需要更多的變量有點混亂。 在任何時候我寫了「height - = n」ô.o –