Хитрость заключается в том, чтобы рассматривать каждого человека как отдельную учетную запись.
Вы можете легко определить (из исходного счета), сколько каждый человек должен заплатить. Установите это как отрицательную сумму для каждого человека. Затем запишите сумму, которую каждый человек заплатил , добавив сумму, выплаченную на его счет. На этом этапе люди, которые переплатили (кредиторы), будут иметь положительные сальдо, а люди, которые переплатили (заемщики), будут иметь отрицательные сальдо.
Не существует единственного правильного ответа, за который заемщик должен деньги каждому кредитору, за исключением очевидного случая, когда есть только один кредитор. Суммы, уплаченные заемщиком, могут перейти к любому из кредиторов. Просто добавьте сумму к общей сумме заемщика и вычтите суммы из кредиторов, которые получают платеж.
Когда все счета обнулились, все заплатили.
Редактировать (в ответ на комментарии):
Я думаю, что моя проблема заключается в том факте, что сумма не всегда делится равномерно, поэтому разработка алгоритма, который обрабатывает это элегантно, кажется, снова и снова сбивает меня с толку.
При работе с долларами и центами не существует 100% чистого способа справиться с округлением. Некоторые люди будут платить на один цент больше, чем другие. Единственный способ быть справедливым - это произвольно назначать дополнительные 0,01 доллара (при необходимости). Это будет сделано только один раз, когда «задолженность» рассчитывается путем деления счета. Иногда это помогает хранить денежные значения в виде центов, а не долларов (например, 12,34 доллара будет храниться как 1234). Это позволяет использовать целые числа вместо чисел.
Чтобы распределить лишние центы, я бы сделал следующее:
total_cents = 100 * total;
base_amount = Floor(total_cents / num_people);
cents_short = total_cents - base_amount * num_people;
while (cents_short > 0)
{
// add one cent to a random person
cents_short--;
}
Примечание: самый простой способ назначить пенни "случайным образом" - это присвоить первый лишний цент первому человеку, второй второму и т. Д. Это становится проблемой, только если вы всегда вводите одни и те же люди в том же порядке.