Swift - 查找所有数字 1...20 的倍数

Swift - Find number that is a multiple of all numbers 1...20

我正在研究 Euler 问题 5,即:

2520是能被1到10的每一个数整除而没有余数的最小数。 能被1到20的所有数整除的最小正数是多少?

我的嵌套循环有问题。我在 while 循环中有一个 for 循环。我的逻辑是 检查数字 (currentNumber) 与 1-20 (i),如果 currentNumber 不是 i 的倍数(使用模块化算术检查) 然后它跳出那个循环并尝试下一个最大的数字。

我的问题是我不知道如何跳出 我的内部循环而不是我的外部循环。这是我的代码:

class Five {
    init() {
        var currentNumber = 1

        while true {
            for i in 1...20 {
                if currentNumber % i != 0 {
                    currentNumber += 1
                    continue
                }
            }

            break
        }

        print("the smallest positive number that is evenly divisible " +
            "by all of the numbers from 1 to 20 is \(currentNumber)")
    }
}

你已经得到了一个很好的正确答案。正如 add-on,对于 为了完整起见:

标记的 continue 语句的替代方法是将内部循环移动到一个单独的函数中,您可以从中“提早 return”:

func isDivisibleBy1To20(_ number: Int) -> Bool {
    for j in 2...20 {
        if number % j != 0 {
            return false
        }
    }
    return true
}

var currentNumber = 1
while !isDivisibleBy1To20(currentNumber) {
    currentNumber += 1
}

print("solution:", currentNumber)

使用函数式方法可以简化为

func isDivisibleBy1To20(_ number: Int) -> Bool {
    return !(2...20).contains(where: { number % [=11=] != 0 })
}

let solution = (1...).first(where: isDivisibleBy1To20)!

print("solution:", solution)

(备注:还有其他更快的方法可以解决这个问题。)