Возникли проблемы при обновлении нескольких аккумуляторов в одном цикле - PullRequest
0 голосов
/ 31 августа 2018

Это функция, которая принимает входные «изменения» и возвращает разбивку того, сколько четвертей, центов, никелей и пенни отдать клиенту.

Мой подход: допустим, изменение составляет $ 0,62

  1. Проверьте это изменение> четверти. Если да, вычтите $ 0,25. Каждый раз, когда вычитается четверть, добавьте 1 к аккумулятору четверти. Повторяйте, пока четверти больше не могут быть вычтены из оставшегося значения изменения. (Это должно привести к 2 кварталам)
  2. Оставшееся изменение составляет $ 0,12 после этого шага
  3. Переход на десять центов - каждый раз, когда из суммы вычитается десять центов, добавляйте 1 к аккумулятору 10 центов
  4. Повтор для никелей и копеек

Хотя я могу легко перебирать массив coinTray и вычитать значения, как мне указать, что, как только массив переместится к следующему элементу, переключиться на следующий аккумулятор и начать добавлять к нему?

Я решил это здесь без использования цикла, но есть ли более эффективный способ сделать это?

func breakdown(change: Double) -> String {

    var coinTray: [Double] = [0.25, 0.10, 0.05, 0.01]
    var totalChange = change

    var quarters = 0
    var dimes = 0
    var nickels = 0
    var pennies = 0

    while totalChange >= coinTray[0] {
        totalChange -= coinTray[0]
        quarters += 1
    }

    while totalChange >= coinTray[1] {
        totalChange -= coinTray[1]
        dimes += 1
    }

    while totalChange >= coinTray[2] {
        totalChange -= coinTray[2]
        nickels += 1
    }

    while totalChange >= coinTray[3] {
        totalChange -= coinTray[3]
        pennies += 1
    }

return "You should have \(quarters) quarter(s), \(dimes) dime(s), \(nickels) nickel(s), and \(pennies) penny/ies."

}

1 Ответ

0 голосов
/ 01 сентября 2018

Я полагаю, что это делает то же самое без цикла.

func breakDown(change: Double) -> String {
    var coinTray: [Double] = [0.25, 0.10, 0.05, 0.01]
    var totalChange = change

    var quarters = 0
    var dimes    = 0
    var nickels  = 0
    var pennies  = 0

    quarters    = Int(totalChange/coinTray[0])
    totalChange = totalChange.truncatingRemainder(dividingBy: coinTray[0])
    dimes       = Int(totalChange/coinTray[1])
    totalChange = totalChange.truncatingRemainder(dividingBy: coinTray[1])
    nickels     = Int(totalChange/coinTray[2])
    totalChange = totalChange.truncatingRemainder(dividingBy: coinTray[2])
    pennies     = Int(totalChange * 100)

    return "You should have \(quarters) quarter(s), \(dimes) dime(s), \(nickels) nickel(s), and \(pennies) penny/ies."
}

Редактировать: Похоже, что ОП хочет этот ответ.

var coinTray: [Double] = [0.25, 0.10, 0.05, 0.01]

var quarters = 0
var dimes   = 0
var nickels = 0
var pennies = 0

var coins = [quarters, dimes, nickels, pennies]

func breakDown(change: Double) -> String {

    var totalChange = change
    for i in 0..<coinTray.count {
        coins[i] = Int(totalChange/coinTray[i])
        totalChange = totalChange.truncatingRemainder(dividingBy: coinTray[i])
    }
    return "You should have \(quarters) quarter(s), \(dimes) dime(s), \(nickels) nickel(s), and \(pennies) penny/ies."
}
...