// Программа разменивает сумму советскими копейками
// Используется "жадный" алгоритм - отнимается по максимуму наибольший,
// что для произвольного набора монет может приводить к неразмененному остатку
// Copyleft Alexey Kuzminov (с) 2016
// количество копеек + падеж от копейки
// ВНИМАНИЕ: требуется сортировка по убыванию и наличие 1 копейки в списке
let coins = [
(50, "копеек")
(20, "копеек")
(10, "копеек")
(5, "копеек")
(3, "копейки")
(2, "копейки")
//(1, "копейке") // !!! закомментирована для демонстрации эффекта неразмена
]
// рекурсивный пробег по списку, откусывая по одному элементу с начала
// возвращает количество монет, которыми разменивается сумма монетами списка
let rec exchange_tail (sum: int byref) list =
match list with
| head :: tail ->
let (value, text) = head // просто парсим кортеж
let count = sum / value
sum <- sum - count * value
if count > 0 then printfn " %d по %d %s" count value text
count + exchange_tail &sum tail
| [] -> 0
// функция размена
let exchange sum =
let mutable total = sum
printfn "\nРазмен суммы %d:" total
printfn "Итого монет %d" (exchange_tail &total coins)
if (total > 0) then printfn "Осталось неразменена сумма %d" total
// для проверки
exchange 14
exchange 98
Ly8g0J/RgNC+0LPRgNCw0LzQvNCwINGA0LDQt9C80LXQvdC40LLQsNC10YIg0YHRg9C80LzRgyDRgdC+0LLQtdGC0YHQutC40LzQuCDQutC+0L/QtdC50LrQsNC80LgKLy8g0JjRgdC/0L7Qu9GM0LfRg9C10YLRgdGPICLQttCw0LTQvdGL0LkiINCw0LvQs9C+0YDQuNGC0LwgLSDQvtGC0L3QuNC80LDQtdGC0YHRjyDQv9C+INC80LDQutGB0LjQvNGD0LzRgyDQvdCw0LjQsdC+0LvRjNGI0LjQuSwKLy8g0YfRgtC+INC00LvRjyDQv9GA0L7QuNC30LLQvtC70YzQvdC+0LPQviDQvdCw0LHQvtGA0LAg0LzQvtC90LXRgiDQvNC+0LbQtdGCINC/0YDQuNCy0L7QtNC40YLRjCDQuiDQvdC10YDQsNC30LzQtdC90LXQvdC90L7QvNGDINC+0YHRgtCw0YLQutGDCi8vIENvcHlsZWZ0IEFsZXhleSBLdXptaW5vdiAo0YEpIDIwMTYKCi8vINC60L7Qu9C40YfQtdGB0YLQstC+INC60L7Qv9C10LXQuiArINC/0LDQtNC10LYg0L7RgiDQutC+0L/QtdC50LrQuAovLyDQktCd0JjQnNCQ0J3QmNCVOiDRgtGA0LXQsdGD0LXRgtGB0Y8g0YHQvtGA0YLQuNGA0L7QstC60LAg0L/QviDRg9Cx0YvQstCw0L3QuNGOINC4INC90LDQu9C40YfQuNC1IDEg0LrQvtC/0LXQudC60Lgg0LIg0YHQv9C40YHQutC1CmxldCBjb2lucyA9IFsKICAoNTAsICLQutC+0L/QtdC10LoiKQogICgyMCwgItC60L7Qv9C10LXQuiIpCiAgKDEwLCAi0LrQvtC/0LXQtdC6IikKICAoNSwgItC60L7Qv9C10LXQuiIpCiAgKDMsICLQutC+0L/QtdC50LrQuCIpCiAgKDIsICLQutC+0L/QtdC50LrQuCIpCiAgLy8oMSwgItC60L7Qv9C10LnQutC1IikgLy8gISEhINC30LDQutC+0LzQvNC10L3RgtC40YDQvtCy0LDQvdCwINC00LvRjyDQtNC10LzQvtC90YHRgtGA0LDRhtC40Lgg0Y3RhNGE0LXQutGC0LAg0L3QtdGA0LDQt9C80LXQvdCwCl0KCi8vINGA0LXQutGD0YDRgdC40LLQvdGL0Lkg0L/RgNC+0LHQtdCzINC/0L4g0YHQv9C40YHQutGDLCDQvtGC0LrRg9GB0YvQstCw0Y8g0L/QviDQvtC00L3QvtC80YMg0Y3Qu9C10LzQtdC90YLRgyDRgSDQvdCw0YfQsNC70LAKLy8g0LLQvtC30LLRgNCw0YnQsNC10YIg0LrQvtC70LjRh9C10YHRgtCy0L4g0LzQvtC90LXRgiwg0LrQvtGC0L7RgNGL0LzQuCDRgNCw0LfQvNC10L3QuNCy0LDQtdGC0YHRjyDRgdGD0LzQvNCwINC80L7QvdC10YLQsNC80Lgg0YHQv9C40YHQutCwCmxldCByZWMgZXhjaGFuZ2VfdGFpbCAoc3VtOiBpbnQgYnlyZWYpIGxpc3QgPQogIG1hdGNoIGxpc3Qgd2l0aCAKICB8IGhlYWQgOjogdGFpbCAtPgogICAgbGV0ICh2YWx1ZSwgdGV4dCkgPSBoZWFkIC8vINC/0YDQvtGB0YLQviDQv9Cw0YDRgdC40Lwg0LrQvtGA0YLQtdC2CiAgICBsZXQgY291bnQgPSBzdW0gLyB2YWx1ZQogICAgc3VtIDwtIHN1bSAtIGNvdW50ICogdmFsdWUKICAgIGlmIGNvdW50ID4gMCB0aGVuIHByaW50Zm4gIiAgJWQg0L/QviAlZCAlcyIgY291bnQgdmFsdWUgdGV4dAogICAgY291bnQgKyBleGNoYW5nZV90YWlsICZzdW0gdGFpbAogIHwgW10gLT4gMAoKLy8g0YTRg9C90LrRhtC40Y8g0YDQsNC30LzQtdC90LAKbGV0IGV4Y2hhbmdlIHN1bSA9CiAgbGV0IG11dGFibGUgdG90YWwgPSBzdW0KICBwcmludGZuICJcbtCg0LDQt9C80LXQvSDRgdGD0LzQvNGLICVkOiIgdG90YWwKICBwcmludGZuICLQmNGC0L7Qs9C+INC80L7QvdC10YIgJWQiIChleGNoYW5nZV90YWlsICZ0b3RhbCBjb2lucykKICBpZiAodG90YWwgPiAwKSB0aGVuIHByaW50Zm4gItCe0YHRgtCw0LvQvtGB0Ywg0L3QtdGA0LDQt9C80LXQvdC10L3QsCDRgdGD0LzQvNCwICVkIiB0b3RhbAoKLy8g0LTQu9GPINC/0YDQvtCy0LXRgNC60LgKZXhjaGFuZ2UgMTQKZXhjaGFuZ2UgOTgK