首页 > 解决方案 > 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 = ""
    }
}

标签: swiftlabeluilabel

解决方案


如果您想快速修复,请在函数内部声明C和。Dcalculate()

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

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

@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 - 16X + 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
    }
}

正则表达式的工作方式在这里那里都有详尽的解释。


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


推荐阅读