2014-06-05 70 views
0

我希望加數儘可能地彼此接近。將因數分解成彼此最接近的加數

x和y - > 「Y被加數是彼此最接近」

15和2 - > 7 + 8

15和3 - > 5 + 5 + 5

15和4 - > 4 + 4 + 4 + 3

15和5 - > 3 + 3 + 3 + 3 + 3

15和6 - > 2 + 2 + 2 + 3 + 3 + 3

...

如果我除以x/y得到一個整數,那麼解就是整數的y倍。但是,如果我得到小數點,它會變得更加複雜,如上例所示。

我該如何計算那些「最接近彼此的加數」與任何x和y最好與JavaScript代碼?

回答

1

計算你的部門的其餘部分。它會告訴你你需要多長時間才能得出整個部門的確切結果,而不是四捨五入。

function closest_summands(x, y) { 
    var div = x/y, 
     rem = x % y, 
     res = []; 
    for (var i=0; i<rem; i++) 
     res.push(Math.ceil(div)); 
    for (  ; i<y; i++) // continue 
     res.push(Math.floor(div)); 
    return res; 
} 

當然,你可以把這個一點點更有效率不重複ceil/floor -computations,我只是想表明它是如何工作的。

0

如果您從x中減去Math.floor(x/y)*y,那麼您可以使用Bressenham's line algorithm來將最小點差的條件餘數擴展。

+0

OP甚至不需要傳播它們。 – Bergi

1
function closest_summands(x, y) { 
    var result = [], 
     n = Math.floor(x/y), 
     i, j; 
    for (i = 0, j = x % y; i < y; i++, j--) { 
     result.push(n + (j > 0 ? 1 : 0)); 
    } 
    return result; 
}