我正在尝试制作质数验证器,以查看数字是否为质数。问题是,当我插入第一个数字如13作为插入的第一个数字时,它说这是一个质数。在我插入非素数(例如48)后,它表示不是素数。但是现在,如果我插入素数,它说不是素数。
import UIKit
class ViewController: UIViewController
{
var D = 1
var C = 0
@IBOutlet weak var labelOUT: UILabel!
@IBOutlet weak var numberIN: UITextField!
@IBAction func Clear(_ sender: Any)
{
labelOUT.text = ""
}
@IBAction func calculate(_ sender: Any)
{
let number = Int(numberIN.text!)
repeat
{
if (number! % D == 0)
{
C = C + 1
}
else
{
}
D = D + 1
}while(D <= number!)
if ( C <= 2 )
{
labelOUT.text = "prime"
}
else
{
labelOUT.text = "not prime"
}
}
override func viewDidLoad() {
super.viewDidLoad()
labelOUT.text = ""
}
}
答案 0 :(得分:1)
如果要快速修复,请在C
函数内声明D
和calculate()
。
您不必查找所有除数即可检查数字是否为质数。一旦找到 a 除数,该数字就不是质数。
这是检查文本字段中的文本是否为质数的更有效方法:
@IBAction func calculate(_ sender: Any)
{
guard let number = Int(numberIN.text!) else
{
fatalError("Not a number")
}
let isPrime = checkIfPrime(number)
labelOUT.text = isPrime ? "prime" : "not prime"
}
它调用此函数来检查number
是否为素数:
func checkIfPrime(_ n: Int) -> Bool
{
switch n
{
case ...1:
return false
case 2...3:
return true
default:
var isPrime = true
let maximumPossibleDivisor = Int(sqrt(Double(n)))
var divisor = 2
repeat
{
if (n % divisor == 0)
{
isPrime = false
break
}
divisor += 1
} while (divisor <= maximumPossibleDivisor)
return isPrime
}
}
它使用the fact来表示一个复合数的除数在2和其平方根之间。
checkPrime()
的更有效版本使用了这样一个事实,即除2
和3
以外的素数都可以写成6X - 1 or 6X + 1:
func checkIfPrime(_ n: Int) -> Bool {
switch n {
case ...1:
return false
default:
if n % 2 == 0 || n % 3 == 0
{
return false
}
let maximumPossibleDivisor = Int(sqrt(Double(n)))
var divisor = 5
while (divisor <= maximumPossibleDivisor)
{
if n % divisor == 0 || n % (divisor + 2) == 0
{
return false
}
divisor += 6
}
return true
}
}
这是使用正则表达式检查数字素数的一种可爱方法:
extension Int {
func isPrime() -> Bool {
guard self >= 0 else { fatalError("Primality is only checked for positive numbers") }
let regex = try! NSRegularExpression(pattern: "^.?$|^(..+?)\\1+$")
let str = Array(repeating: "1", count: self).joined()
let range = NSMakeRange(0, self)
return regex.matches(in: str, range: range).count == 0
}
}
有关素数测试的更多信息,请查看here。
答案 1 :(得分:-1)
您需要在calculate()方法顶部重置C和D。
@IBAction func calculate(_ sender: Any)
{
D = 1
C = 0
否则,先前计算的结果会影响您新计算的结果。 下次您像这样陷入困境时,请设置一些断点,并仔细地逐步遍历算法并研究所有计算。然后,您将知道自己做错了什么,或者至少知道哪一行没有按预期方式计算,并且可以将疑问集中在那条线上。