素数确定程序

时间:2016-01-05 17:45:11

标签: swift primes

我的逻辑出了什么问题? 9这个循环如何作为素数而非素数出现?

这可以按照0,1,2,3,4,5,6,7,8的预期工作,但在9上挂起......

var userInput = 9

if userInput == 0 {
    print("0 is not a prime number")
} else if userInput == 1 {
    print("1 is not a prime number")
} else if userInput == 2 {
    print("2 is a prime number")
} else {
    for var i = 2; i < userInput; i = i + 1 {
        if userInput % i == 0 {
            print("\(userInput) is not a prime number")
            break
        } else {
            print("\(userInput) is a prime number")
            break
        }
    }
}

3 个答案:

答案 0 :(得分:5)

删除其中一个break语句。循环需要完全运行,直到找到不是素数的条件。如果没有找到上述条件,则为素数。

var userInput = 9

if userInput == 0 {

    print("0 is not a prime number")

} else if userInput == 1 {

    print("1 is not a prime number")

} else if userInput == 2 {

    print("2 is a prime number")

} else {

    for var i = 2; i < userInput; i = i + 1 {

        if userInput % i == 0 {

            print("\(userInput) is not a prime number")
            break

        } else {

            print("\(userInput) is a prime number")
            // no break here

        }
    }
}

或者更有用:

逻辑嵌入在函数中,因此您可以使用return代替break来控制流。因为最后有一个return true,您只需要查找false条件。如果它不是素数,你使用return false来逃避函数,并且永远不会调用末尾的return true

extension Int {

    func isPrimeNumber() -> Bool {

        switch self {
        case 0 : return false
        case 1 : return false
        default :
            for i in 2..<self {
                if (self % i) == 0 {
                    return false
                }
            }
        }
        return true
    }
}

userInput.isPrimeNumber()

该功能位于Int的扩展名中,因此您只需从userInput调用该功能即可。

答案 1 :(得分:4)

这种逻辑是有缺陷的:

for var i = 2; i < userInput; i = i + 1 {
    if userInput % i == 0 {
        print("\(userInput) is not a prime number")
        break
    } else {
        print("\(userInput) is a prime number")
        break
    }
}

if-else错了。相反,您需要循环遍历for循环首先整个 if部分,测试每个数字是否是一个因子(if userInput % i == 0) , 一遍又一遍; 然后只有,如果你已经完成了循环并且仍然没有发现一个因素,你能否声明这必须是一个素数。

然而,如果你把所有东西都设置在平坦的顶层,你就会发现很难成功地编写这个逻辑。问题是,当你处于顶层时,你无法做出真正的退出。因此,你的逻辑要求你把所有东西放在一个函数中,你可以通过return来强制提前退出。

在这次重写中,我已经完成了这一点,而且我使用的switchif...else if更清晰(和更快):

func testForPrime(userInput:Int) {
    switch userInput {
    case 0: print("0 is not a prime number")
    case 1: print("1 is not a prime number")
    case 2: print("2 is a prime number")
    default:
        for i in 2..<userInput {
            if userInput % i == 0 {
                print("\(userInput) is not a prime number")
                return
            }
        }
        print("\(userInput) is a prime number")
    }
}

以下是测试方法:

for i in 0...20 {testForPrime(i)}

输出:

0 is not a prime number
1 is not a prime number
2 is a prime number
3 is a prime number
4 is not a prime number
5 is a prime number
6 is not a prime number
7 is a prime number
8 is not a prime number
9 is not a prime number
10 is not a prime number
11 is a prime number
12 is not a prime number
13 is a prime number
14 is not a prime number
15 is not a prime number
16 is not a prime number
17 is a prime number
18 is not a prime number
19 is a prime number
20 is not a prime number

(另请注意,我使用了Swift风格的for循环而不是C风格的for循环。你应该习惯Swift风格,因为C风格的for循环将从语言很快。)

答案 2 :(得分:1)

我的解决方案在评论框中看起来很糟糕。我在这里重新粘贴了它们。再次感谢您的帮助!

var uI = 9

var isPrime = true

if uI == 0 || uI == 1 {

    isPrime = false

}

for var i = 2; i < uI; i++ {

    if uI % i == 0 {

        isPrime = false  
    }
}

if isPrime {

    print("\(uI) is prime!")

} else {

    print("\(uI) is not prime”)

}
var uI = 11

var isPrime = true

if uI == 0 || uI == 1 {

    isPrime = false

}

var i = 2

while i < uI {

    if uI % i == 0 {

        isPrime = false

    }
    i++

}

if isPrime {

    print("\(uI) is prime!”)

} else {

    print("\(uI) is not prime”)

}