2015-01-19 4 views
-2

Я начинающий программист, изучающий Swift и делающий базовый простой контролер чисел. Независимо от того, что это даст только один результат, вместо того, чтобы меняться в зависимости от того, имеет ли он число или нет, это простое. Любая помощь будет оценена по достоинству.Prime number checker возвращает тот же результат каждый раз

@IBAction func primeCheck(sender: AnyObject) { 

var numberInt = number.text.toInt() 
var isPrime = true 

    if number != nil {   
     if numberInt == 1 {  
      isPrime = false 
     } 

     if numberInt != 1 {   
      for var i = 2; i < numberInt; i++ {   
       if numberInt! % i == 0 { 
        isPrime = false 
       } else { 
        isPrime = true 
       } 
      } 
     } 

    } 

    if isPrime == true { 
     result.text = "\(numberInt!) is a prime number!" 
    } else { 
     result.text = "\(numberInt!) is not a prime number!" 
    } 

} 
+0

если numberInt% я! = 0 { IsPrime = ложь } еще { IsPrime = истина } –

+0

Позвольте мне знать, если мой ответ помог. – Fogmeister

ответ

-1

Вы должны выйти из цикла после того, как найдете, что число делится на другое число. Также для первичной проверки вам нужно только проверить делимость до квадратного корня из числа.

Вы также можете использовать опциональную привязку для извлечения numberInt и проверить нуль. Это быстрый способ.

@IBAction func primeCheck(sender: AnyObject) { 

    var isPrime = true 
    if let numberInt = number.text.toInt() { 

     if numberInt == 1 { 
      isPrime = false/
     } 
     else // Add else because you dont have to execute code below if number is 1 
     { 
      if numberInt != 1 { 
       for var i = 2; i * i <= numberInt; i++ { // Only check till squareroot 
        if numberInt % i == 0 { 
         isPrime = false 
         break // Break out of loop if number is divisible. 

        } // Don't need else condition because isPrime is initialised as true. 
       } 
      } 
     } 

     if isPrime { 
      result.text = "\(numberInt) is a prime number!" 
     } else { 
      result.text = "\(numberInt) is not a prime number!" 
     } 
    } 

} 

Причина квадратного корня проверки: Why do we check up to the square root of a prime number to determine if it is prime?

Вы можете уточнить код дальнейшего рефакторинга премьер проверки в отдельную функцию.

func isPrime(number:Int) -> Bool 
{ 
    if number == 1 { 
     return false 
    } 
    else 
    { 
     if number != 1 { 
      for var i = 2; i * i <= numberInt; i++ { 
       if numberInt % i == 0 { 
        return false 
       } 
      } 
     } 
    } 
    return true 
} 

@IBAction func primeCheck(sender: AnyObject) { 

    if let numberInt = number.text.toInt() { 

     if isPrime(numberInt) { 
      result.text = "\(numberInt) is a prime number!" 
     } else { 
      result.text = "\(numberInt) is not a prime number!" 
     } 
    } 

} 
+0

LOL, этот обновленный код выглядит ужасно знакомым ... Интересно, откуда он? Это почти как у меня, но потребуется в два раза больше времени для запуска. лол. Ну ладно, не все лучшие ответы принимаются. – Fogmeister

+0

о да. даже число пропуск. Я забыл об этом. – rakeshbs

-1

Ну я не знаю, о быстры, но, возможно, это вредительство код:

если numberInt! < <

Чтобы выполнить более быстрый алгоритм, вы можете просто искать делители от 2 до sqrt (numberInt). (Теорема)

0

Ошибка в вашей логике приходит в этом разделе:

if numberInt! % i == 0 { 
    isPrime = false 
} else { 
    isPrime = true 
} 

В верхней части вашей функции, инициализации isPrime, чтобы быть правдой, так что в цикле вам нужно только искать случаи, доказать число нет prime. Вы никогда не должны установить isPrime = true снова, так что просто опустить условие еще:

if numberInt! % i == 0 { 
    isPrime = false 
} 
0

Вы на самом деле есть две функции здесь. Один, чтобы проверить, является ли число простым, а другое - отображать результат. Разделение их упрощает управление.

// function to check primality and return a bool 
// note that this can only accept a non optional Int so there is 
// no need to check whether it is valid etc... 
func checkNumberIsPrime(number: Int) -> Bool { 
    // get rid of trivial examples to improve the speed later 
    if number == 2 || number == 3 { 
     return true 
    } 

    if number <= 1 || number%2 == 0 { 
     return false 
    } 

    // square root and round up to the nearest int 
    let squareRoot: Int = Int(ceil(sqrtf(Float(number)))) 

    // no need to check anything above sqrt of number 
    // any factor above the square root will have a cofactor 
    // below the square root. 
    // don't need to check even numbers because we already checked for 2 
    // half the numbers checked = twice as fast :-D 
    for i in stride(from: 3, to: squareRoot, by: 2) { 
     if number % i == 0 { 
      return false 
     } 
    } 

    return true 
} 

// function on the button. Run the check and display results. 
@IBAction func primeCheck(sender: AnyObject) { 
    let numberInt? = numberTextField.text.toInt() // don't call a text field "number", it's just confusing. 

    if let actualNumber = numberInt { 
     if checkNumberIsPrime(actualNumber) { 
      resultLabel.text = "\(actualNumber) is a prime number!" // don't call a label "result" call it "resultLabel". Don't confuse things. 
     } else { 
      resultLabel.text = "\(actualNumber) is not a prime number!" 
     } 
    } else { 
     resultLabel.text = "'\(numberTextField.text)' is not a number!" 
    } 
} 

Это делает его очень легким для чтения и обслуживания.

+0

Любая причина неправильного голосования здесь? Пожалуйста, покажите мне, как мой код не работает, и я покажу вам, что вы ошибаетесь. :) – Fogmeister

1

У меня есть другое возможное решение. Сначала я делю на два, потому что это не может быть простое число. Затем вы зацикливаетесь до тех пор, пока номер не станет простым, или число, деленное на два, меньше, чем разделитель.

@IBAction func primeCheck(sender: AnyObject) { 

    var numberInt = number.text.toInt() 
    var isPrime = true 
    var divider = 3 

    if number < 2 || (number != 2 && number % 2 == 0) { 
     isPrime = false 
    } 

    // you only have to check to half of the number 
    while(isPrime == true && divider < number/2){ 
     isPrime = number % divider != 0 
     divider += 2 
    } 

    if isPrime == true { 
     result.text = "\(numberInt!) is a prime number!" 
    } else { 
     result.text = "\(numberInt!) is not a prime number!" 
    } 
} 
Смежные вопросы