#arrays #swift #function
Вопрос:
// I am attempting to answer the following question:
Если мы перечислим все натуральные числа ниже 10, кратные 3 или 5, мы получим 3, 5, 6 и 9. Сумма этих кратных равна 23.
//Find the sum of all the multiples of 3 or 5 below 1000.
// function creating both integers, max number, and filtering
func sumOfMultiples(x: Int, y: Int, n: Int) {
var numberList: [Int] = []
for i in 0..<y {
if x < n amp;amp; y < n amp;amp; x % n == 0 || y % n == 0 {
return numberList.append(i)
}
}
}
sumOfMultiples(x: 3, y: 5, n: 1000)
Комментарии:
1. Не используйте возврат
return
. И где вы подводите итоги?2. Решение ЧП №1 ?
3. Входит ли в требования запись списка всех номеров? Если нет, вы можете просто продолжать добавлять «сумму» каждый раз по кругу и возвращать ее
4. Не могли бы вы подробнее рассказать, где и почему вам нужно добавить пустой массив? В худшем случае вы можете объявить массив типа [Любой], а затем просто добавить([])
5. @MartinR Да!!! В настоящее время я работаю над exercism.io
Ответ №1:
Я не уверен, чего пытается достичь ваш код, но он не может работать по нескольким причинам.
Вот некоторый рабочий код, который достигает этого:
func sumOfMultiples(x: Int, y: Int, n: Int)->Int {
var returnValue: Int = 0
if x < n amp;amp; y < n {
for i in 0..<n {
if i % x == 0 || i % y == 0 {
returnValue = i
}
}
}
return returnValue
}
print(sumOfMultiples(x: 3, y: 5, n: 1000))
Выход:
233168
Проблемы в опубликованном вами коде заключаются в следующем:
- Функция не имеет возвращаемого типа (это функция void). Я добавил
->Int
, чтобы вернуть целое число. - Функция хранит список целых чисел — почему? Если требуется только сумма, сохраните значение в an
Int
и верните его. for
Цикл продолжается до тех пор, покаy
. На самом деле, так и должно бытьn
.- Сравнение для
x
иy
нижеn
выполняется в каждой итерации цикла. Не нужно тратить ресурсы впустую — сделайте это до цикла. - Операция по модулю (
x % n
иy % n
) недопустима для варианта использования. Это на самом делеi % x
иi % y
потому, что вы тестируетеi
в каждом конкретном случае.
Комментарии:
1. Проверки для
x < n amp;amp; y < n
этого не нужны. Существует также специальный методisMultiple(of:)
для проверки делителей.2. Мартин, ты не помог оператору придумать решение, ты дал им готовое решение. Это звучит как домашнее задание, и если вы просто дадите полный ответ, ОП не будет учиться.
Ответ №2:
Если результат, который вы хотите, является суммой всех чисел:
func sumOfMultiples(x: Int, y: Int, n: Int) -> Int {
var result = 0
for number in 1..<n {
if number % x == 0 || number % y == 0 {
result = number
}
}
return result
}
Если вы хотите получить массив со всеми числами:
func arrayOfMultiples(x: Int, y: Int, n: Int) -> [Int] {
var result: [Int] = []
for number in 1..<n {
if number % x == 0 || number % y == 0 {
result.append(number)
}
}
return result
}
Вы также можете использовать пользовательский диапазон в качестве параметра, например:
func sumOfMultiples(x: Int, y: Int, n: ClosedRange<Int>) -> Int {
var result = 0
for number in n { //Notice the change from 1..<n to just n
...
}
func arrayOfMultiples(x: Int, y: Int, n: ClosedRange<Int>) -> [Int] {
var result: [Int] = []
for number in n { //Notice the change from 1..<n to just n
...
}
и назови это так:
sumOfMultiples(x: 3, y: 5, n: 10...20)
//Result is 75
arrayOfMultiples(x: 3, y: 5, n: 10...20)
//Result is [10, 12, 15, 18, 20]
Комментарии:
1. Большое вам СПАСИБО!!!!! Я действительно ценю, что вы нашли время, чтобы показать мне, как решить эту проблему, используя как массив, так и сумму. Вы также только что познакомили меня с пользовательскими диапазонами — спасибо!