【问题标题】:Swift - Find number that is a multiple of all numbers 1...20Swift - 查找是所有数字 1...20 的倍数的数字
【发布时间】:2018-09-17 02:47:27
【问题描述】:

我正在处理Euler 问题 5,即:

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

我的嵌套循环有问题。我在while 循环中有一个for 循环。我的逻辑是我 如果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)")
    }
}

【问题讨论】:

    标签: swift loops modulo


    【解决方案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)
    

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

    【讨论】:

    • 更快的方法是什么?
    • @keepIT100 我不想破坏自己发现这一点的乐趣!只是作为一个提示,它与一些(简单的)数论函数有关。如果实在不想自己解决,直接在codereview.stackexchange.com上搜索“Euler 5”即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多