2017-02-19 69 views
0

假設我有三個整數,x,y和w。我需要爲z解決方程x/y = z/w。 (這種情況的一個特別普遍需要的是一些分數的百分比的轉換:x = 20, y = 40, 20/40 = z/100如何使用整數運算法求解方程x/y = z/w?

簡單地計算這個作爲z = x/y * w使用整數總是會產生0時y > x當不用時會產生不準確的答案。將此計算爲z = x * w/y將產生錯誤的答案,因爲x或w的高值溢出,即使x < = y時也是如此。

一個顯而易見的解決方案是將輸入轉換爲浮點,然後將輸出轉換回整數,但這似乎是一個普遍存在的問題,需要採用更多創新的解決方案。

另外:如果w比最大可表示值大1,對於uintw = 2^32?這可以用整數數學來表示嗎?

+0

我發現,對於y <= w'和'abs(x)<= y' - 這是我現在最重要的一個 - 可以精確計算爲'x *(w/y )+((w%y)/(y/x))' – Pineapple

+0

對於'w = uint.max + 1'和'abs(x) Pineapple

+0

處理y> w並不容易解決的情況該死的 – Pineapple

回答

0

只需計算此爲z = x/y的*瓦特使用整數總是 產生0當y> X

這是一個正確的解決方案

,將產生不準確的答案當不是時

只有當它溢出的意義上,結果不可能被存儲在喲你的整數數據類型,然後所有的賭注都關閉,無論如何?

由於您不限制使用的編程語言,因此有些語言具有內置的任意大整數,例如,紅寶石,所以它不能按定義溢出(除非當y = 0時,但是無論如何你都有問題)。

當你想爲z計算所有可能的值或者當任何數字可以是負數時,它會變得更有趣,但是你需要定義你想遵循的規則。

+0

因爲我說過,我需要正確的解決方案,甚至當'x * w'會溢出時,我認爲可以安全地假設我沒有在這裏使用任意大的整數 – Pineapple