swift - UILabel 不会在每次计算时刷新
问题描述
我正在尝试制作一个素数验证器,以查看一个数字是否为素数。问题是当我插入一个像 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 = ""
}
}
解决方案
如果您想快速修复,请在函数内部声明C
和。D
calculate()
您不必找到所有除数来检查一个数字是否为素数。一旦你找到一个除数,这个数就不是质数了。
这是检查文本字段中的文本是否为素数的一种更有效的方法:
@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
}
}
它使用了一个复合数在 2 和它的平方根之间有一个除数的事实。
一个更有效的版本checkPrime()
使用这样一个事实,即除了2
和之外的素数3
都可以写成6X - 1或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
}
}
正则表达式的工作方式在这里和那里都有详尽的解释。
有关素性测试的更多信息,请查看此处。
推荐阅读
- webpack - 是否可以使用 webpack 从 es6 编译为 commonjs
- nginx - Nginx 在 keycloak 和本地微服务前
- swift - UIViewController 的便捷初始化中调用了什么初始化程序?
- reactjs - React Native:状态有时为空 - setState 正在异步工作
- java - 尝试为 Android 设置 Gmail API 时,应用程序崩溃并给出 NullPointerException 错误
- image - 图像识别 api 和图像中的图像计数
- c# - 如何使用 C# 使用现代身份验证连接到邮箱
- vba - 是/否数据类型始终显示为真/假 - 布尔格式问题
- c++ - 如何通过悬停光标来获取 UIAutomationElement 的 NamePropertyId?
- python - 'string.format' 是否允许对迭代/字典进行更多控制?