gpt4 book ai didi

swift - UILabel 不会在每次计算时刷新

转载 作者:行者123 更新时间:2023-11-30 11:03:26 26 4
gpt4 key购买 nike

我正在尝试制作一个素数验证器来查看一个数字是否是素数。问题是,当我插入像 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 = ""
}
}

最佳答案

如果您想要快速修复,请在 calculate() 函数内声明 CD

您不必找到所有除数来检查数字是否为素数。一旦找到除数,这个数字就不是质数了。

这是检查文本字段中的文本是否为素数的更有效方法:

@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() 版本利用了以下事实:除 23 之外的素数都可以写为 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
}
}

正则表达式的工作方式在 herethere 中有详细解释。

<小时/>

有关素性测试的更多信息,请查看 here

关于swift - UILabel 不会在每次计算时刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53022927/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com