模数运算后,Swift 3.0返回不正确的值

时间:2017-05-15 05:28:38

标签: swift

为什么以下函数返回整数2000,即使它不能被数字3,6,7,9整除?

var counter = 1000

func divisibleByAllTenNumbers() -> Int{
    for _ in 1...counter {
        if counter % 2 == 0 && counter % 3 == 0 && 
           counter % 4 == 0 && counter % 5 == 0 && 
           counter % 6 == 0 && counter % 7 == 0 && 
           counter % 8 == 0 && counter % 9 == 0 && 
           counter % 10 == 0 {

           break
        }
        else {
            counter = counter + 1
        }
    }

    return counter
}
即使预期的数字为2520,

2000也显示为输出。

可能的原因是什么?

1 个答案:

答案 0 :(得分:1)

您对counter的使用感到困惑。它从1000开始,因此for循环迭代1000次(1 ... 1000)。但是counterfor循环内从1000增加到1999。因此,您的if语句仅检查值1000到1999,最后一个增量将其设置为2000(但由于循环结束,因此不会检查该值。

因此没有值匹配,并返回counter(2000)的最终值。

我会将for循环更改为更清晰。如果要检查2000 - 3000范围内的数字,请说明:

for counter in 2000...3000 {

并摆脱var counter = ...行。

您可能还想更改返回的值以指示未找到匹配项。这对于可选项来说非常有用。

我还为您的函数提供参数以指定范围。

func divisibleByAllTenNumbers(_ from: Int, to: Int) -> Int? {
    for counter in from...to {
        if counter % 2 == 0 && counter % 3 == 0 && 
           counter % 4 == 0 && counter % 5 == 0 && 
           counter % 6 == 0 && counter % 7 == 0 && 
           counter % 8 == 0 && counter % 9 == 0 && 
           counter % 10 == 0 {

           return counter
        }
    }

    return nil
}

if let result = divisibleByAllTenNumbers(2000, to: 3000) {
    print("Found result of \(result)")
} else {
    print("No match found")
}

输出:

  

找到2520的结果