2017-02-19 26 views
0

Предположим, что у меня есть три целых числа, x, y и w. Мне нужно решить уравнение x/y = z/w для z. (Одним из наиболее общей потребности для этого является преобразованием некоторой доли в проценты:. x = 20, y = 40, 20/40 = z/100)Как можно решить уравнение x/y = z/w для z, используя целочисленную арифметику?

Просто вычисление это как z = x/y * w с использованием целых чисел всегда будет производить 0, когда y > x и будет производить неточные ответы, когда когда нет. Вычисляя это как z = x * w/y, вы получите неправильные ответы из-за переполнения при больших значениях x или w даже тогда, когда x < = y.

Очевидным решением является передача входов в плавающую точку, а затем выход обратно в целое число, но это кажется довольно распространенной проблемой, чтобы иметь более инновационные решения, чем это.

Также: что, если w - это больше, чем максимальное отображаемое значение, например. для uint, w = 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

Просто вычисления это как г = х/у * ш с использованием целых чисел будет всегда произвести 0, когда у> х

, который является правильным решением

и будет производить неточные ответы когда когда нет

Только при переполнении в том смысле, что результат не может быть сохранен в лету ur целочисленный тип данных, а затем все ставки отключены?

Поскольку вы не ограничиваете используемый язык программирования, существуют некоторые языки со встроенными произвольными большими целыми числами, например. ruby, поэтому он не может переполняться там по определению (кроме случаев, когда y = 0, но тогда у вас есть проблема в любом случае).

Это становится немного интереснее, если вы хотите вычислить все возможные значения для z или когда любое из чисел может быть отрицательным, но тогда вам нужно определить, какие правила вы хотите соблюдать.

+0

Поскольку я упоминал, что мне нужны правильные решения даже когда 'x * w' будет переполняться, я думаю, что можно с уверенностью предположить, что я не работаю с произвольно большими целыми числами здесь – Pineapple