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

时间:2018-04-07 03:27:13

标签: swift loops modulo

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

2520是可以除以1到10中的每个数字而没有任何余数的最小数字。 从1到20的所有数字均可被整除的最小正数是多少?

我的嵌套循环遇到了问题。我在for循环中有一个while循环。我的逻辑是我 如果currentNumber不是i的倍数,则检查一个(currentNumber)对1-20(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)")
    }
}

1 个答案:

答案 0 :(得分:1)

你已经得到了一个正确的答案。就像一个附加组件一样 完整性:

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

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 % $0 != 0 })
}

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

print("solution:", solution)

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