2 回答

TA貢獻1865條經驗 獲得超7個贊
對于偶數(shù) length m,我們可以很容易地說:
cols = m / 2
rows = 2
對于奇數(shù)長度m,我們需要分解m。幸運的是,只需要一個非平凡的(1 或m)因子就足夠了。通過以下算法:
for(var i = 3; i * i < m; i += 2){
if(m % i == 0)
return i;
}
return -1;
如果結果是-1,它將是質數(shù),因此,最終結果將是:
cols = (m+1)/2
rows = 2
否則,如果我們調用 factor k,結果將是:
cols = m / k
row = k
您可以在以下內容中找到最終結果:
function factor(m){
// if m is even
if(m % 2 == 0)
return [2, m/2]
for(var i = 3; i * i < m; i += 2){
// m is odd and not prim
if(m % i == 0)
return [i, m/i];
}
// m is odd prime
return [2, (m+1)/2];
}
console.log(factor(8));
console.log(factor(10));
console.log(factor(11));
console.log(factor(15));
此功能的結果已優(yōu)化(根據(jù)您的定義)。因為余數(shù)對于非素數(shù)為零,而1
對于素數(shù)則為零。

TA貢獻1816條經驗 獲得超4個贊
假設這些數(shù)字永遠不會大到天文數(shù)字,您可以只檢查每個數(shù)字從平方根開始的擬合程度,并在給定評估函數(shù)的情況下跟蹤最佳數(shù)字,該評估函數(shù)既考慮了余數(shù)又考慮了方差。所以像:
function optimizeRectangle(N) {
let bestRectangle = null;
let best_evaluation = Infinity;
let start_row = Math.floor(Math.sqrt(N));
// Maximum aspect ratio of 3:1
for (let offset = 0; offset < start_row / 2; offset++) {
let row = start_row - offset;
let col = Math.ceil(N/row);
let remainder = row * col - N;
let evaluation = remainder + offset; // or some other function of remainder and offset
if (evaluation < best_evaluation) {
best_evaluation = evaluation;
best_rectangle = [row, col];
}
}
return best_rectangle;
}
請注意,我實際上并沒有運行這段代碼,所以如果沒有運行,請將其視為偽代碼。
添加回答
舉報