Проблемы с обновлением нескольких аккумуляторов в одном цикле

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

Мой подход: допустим, сдача составляет 0,62 доллара.

  1. Проверка есть сдача> четверти. Если да, вычтите 0,25 доллара. Каждый раз, когда вычитается четверть, прибавляйте 1 к квартальному аккумулятору. Повторяйте до тех пор, пока четверть не перестанут вычитаться из оставшегося значения изменения. (Это должно привести к 2 кварталам)
  2. После этого шага оставшаяся сдача составит 0,12 доллара США.
  3. Переходите к десятицентовым монетам - каждый раз, когда из изменения вычитается десятицентовая монета, прибавляйте 1 к накопителю центов.
  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."

}

"Я решил это здесь без использования цикла", эээ ... похоже, вы используете 4.

Rakesha Shastri 01.09.2018 07:14

@RakeshaShastri Верно, всего 4 цикла while. Но мне интересно, есть ли способ очистить их в один цикл, поскольку все повторяется, кроме аккумулятора.

lolrie 01.09.2018 17:21

Как насчет без них? Как этот ответ, опубликованный ниже? :)

Rakesha Shastri 01.09.2018 17:25

Я отредактировал ответ. Думаю, я понимаю, что вы искали. Но это непрактично для динамического числа переменных, и в этом случае вам придется использовать массив кортежей, что сложно для такой простой вещи.

Rakesha Shastri 02.09.2018 08:53
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
4
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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."
}

Обновлено: похоже, что OP хочет этого ответа.

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."
}

Другие вопросы по теме