Это функция, которая принимает вводимые «сдачу» и возвращает разбивку того, сколько четвертаков, десятицентовиков, пятак и пенсов вернуть покупателю.
Мой подход: допустим, сдача составляет 0,62 доллара.
Хотя я могу легко перебирать массив 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."
}
@RakeshaShastri Верно, всего 4 цикла while. Но мне интересно, есть ли способ очистить их в один цикл, поскольку все повторяется, кроме аккумулятора.
Как насчет без них? Как этот ответ, опубликованный ниже? :)
Я отредактировал ответ. Думаю, я понимаю, что вы искали. Но это непрактично для динамического числа переменных, и в этом случае вам придется использовать массив кортежей, что сложно для такой простой вещи.



Я считаю, что это то же самое без цикла.
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."
}
"Я решил это здесь без использования цикла", эээ ... похоже, вы используете 4.