"Ярмарка" Целочисленное среднее - PullRequest
2 голосов
/ 15 февраля 2011

Мне нужно получить среднее значение числа, но не в десятичной форме, оно мне нужно в "честной" целочисленной форме.Я не знаю, является ли это лучшим способом объяснить это, поэтому вот несколько примеров.

Пример:

51 / 4 = 12.75

Но мне нужно что-то более похожее на:

51 / 4 = 13,13,13,12

Любые предложения будут с благодарностью.

Ответы [ 5 ]

7 голосов
/ 15 февраля 2011

Сначала используйте программное целочисленное деление, затем используйте модуль, чтобы найти остаток. Вот пример:

Полагаясь на целочисленное деление, уничтожающее ваш остаток.

99/5 = 19

Затем используйте модуль, чтобы найти остаток

99 % 5 = 4

Затем увеличить четыре числа ...

дает список

20 20 20 20 19
3 голосов
/ 15 февраля 2011

В псевдокоде:

int base = floor( dividend / divisor );
int with_one_more = dividend MOD divisor;

Результатом будет with_one_more записей, которые равны base+1, и divisor-with_one_more записей, которые base. В вашем примере dividend = 51, divisor = 4. Это составляет base = 12 и with_one_more = 3.

2 голосов
/ 15 февраля 2011

Ну, для х / у это будет список, который содержит число (x div y) + 1 так часто, как (x mod y) раз, и содержит число (x div y) так часто, как y - (х мод у) раз.

1 голос
/ 15 февраля 2011

Если 51/4 возвращает округленное до целого число, в данном случае 12, вы знаете, что значение падает между 12 и 13, поэтому возьмите 51 модуль 13, равный 12.

x/y = z
x mod (z + 1) = w

ваши числа(y - 1) умножить на z и w, например:

63/4 = 15
63 mod (15 + 1) = 15

, поэтому числа (4 - 1) умножаются на 16 и 15: 16, 16, 16, 15.

1 голос
/ 15 февраля 2011

Насколько я понимаю, ваше определение "честной целочисленной формы", алгоритм для ее решения может принять следующую форму:

  1. Определите рациональное выражение числа (т. Е. p / q для некоторых p, q, если оно еще не в этой форме).
  2. При желании уменьшите это значение до максимально упрощенной формы (это приведет к максимально короткому выводу, хотя пропуск этого шага все равно приведет к созданию "честных" списков)
  3. Разделите это выражение на целое число и оставшуюся дробную часть - так что в вашем 51/4 случае у вас будет 12 и 3/4. Позвоните по этим номерам n и p/q.
  4. Выведите q чисел, первые p из которых n + 1, а остальные n.
...