UILabel不会在每次计算时刷新

时间:2018-10-27 14:35:41

标签: swift label 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 = ""
    }
}

2 个答案:

答案 0 :(得分:1)

如果要快速修复,请在C函数内声明Dcalculate()

您不必查找所有除数即可检查数字是否为质数。一旦找到 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()的更有效版本使用了这样一个事实,即除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

答案 1 :(得分:-1)

您需要在calculate()方法顶部重置C和D。

@IBAction func calculate(_ sender: Any)
{ 
    D = 1
    C = 0

否则,先前计算的结果会影响您新计算的结果。 下次您像这样陷入困境时,请设置一些断点,并仔细地逐步遍历算法并研究所有计算。然后,您将知道自己做错了什么,或者至少知道哪一行没有按预期方式计算,并且可以将疑问集中在那条线上。