c++, денежные системы

167
16 мая 2019, 01:30

есть задачка: Старая английская денежная система использует три единицы для хранения денежных величин: фунты, шиллинги и пенсы. Один фунт (pound) состоит из 20 шиллингов, 1 шиллинг (shilling) – из 12 пенсов (penny, pence). Самая маленькая монета («фартинг») равняется четверти пенса, поэтому все расчеты требуется вести с точностью до ¼ пенса. Требуется создать класс для хранения информации о наличии денег в этой денежной системе. Сумма денег может быть как положительной, так и отрицательной. Максимальная (по модулю) хранимая величина – 1 млрд. фунтов....

Как лучше хранить деньги? В голову приходят такие решения:

  1. хранить все в фартингах long long (64 бита), а потом переводить, когда нужно вывести
  2. int фунты, char/short шилинги, float пенсы
  3. int фунты, char/short шилинги, char/short пенсы и char/short фартинги
  4. int фунты, шилинги пенсы и фартинги хранить в фартингах short

В первом случае будет проще всего проводить арифметические операции, но многова-то памяти, по сравнению с третьим вариантом. В третьем варианте затратно будет производить арифм. операции. четвертый вариант экономнее на 25% первого, но операции по прежнему не очень удобно проводить.

Как бы вы это реализовали? Спасибо

Answer 1

2 вариант не рассматриваем. 3 и 4 варианты все равно будут занимать по 8 байт как и 1, из-за выравнивания. Можно выравнивание отключить и получить небольшой выигрыш по памяти, но тогда вы получите снижение производительности при работе с такими структурами.

Поэтому на самом деле рабочий вариант только один - первый.

READ ALSO
Вычисление количества ударов

Вычисление количества ударов

Нужно подсчитать количество потраченых ударов для убийства монстраНа вход поступают: начальный урон [d], увеличение урона при каждом ударе...

120
Что это значит `str[i]!=(char)NULL`?

Что это значит `str[i]!=(char)NULL`?

Что это значит str[i]!=(char)NULL?

137
Не хочет инициализироваться поток

Не хочет инициализироваться поток

Каждый параметр абсолютно верен, но почему-то вызывается exception в std::invokeКод: Вызываемая функция:

130
Отключить возможность перемещения Confirm Dialog мышью

Отключить возможность перемещения Confirm Dialog мышью

Всем привет, Хочу сделать так, чтобы Confirm dialog (окно) невозможно было перемещать мышью

115