2016-01-05 2 views
0

Что случилось с моей логикой? Как можно выйти из этого цикла как в простом, так и в простом числе?Программа определения числа номеров

Это работает, как ожидается, в течение 0, 1, 2, 3, 4, 5, 6, 7, 8, но получает вешали на 9 ...


var userInput = 9 

if userInput == 0 { 
    print("0 is not a prime number") 
} else if userInput == 1 { 
    print("1 is not a prime number") 
} else if userInput == 2 { 
    print("2 is a prime number") 
} else { 
    for var i = 2; i < userInput; i = i + 1 { 
     if userInput % i == 0 { 
      print("\(userInput) is not a prime number") 
      break 
     } else { 
      print("\(userInput) is a prime number") 
      break 
     } 
    } 
} 
+0

не непосредственно реагировать на ваш вопрос, но имейте в виду, что вы не должны проверить все факторы больше, чем 'UserInput/3'. –

+1

@ RomanSausarnes на самом деле ему не нужно проверять факторы за пределами квадратного корня 'userInput' – Cristik

ответ

4

Эта логика ошибочна:

for var i = 2; i < userInput; i = i + 1 { 
    if userInput % i == 0 { 
     print("\(userInput) is not a prime number") 
     break 
    } else { 
     print("\(userInput) is a prime number") 
     break 
    } 
} 

if-else неправильно. Скорее всего вам нужно пройти через if часть цикла , проверяя, является ли каждое число фактором (if userInput % i == 0), снова и снова; тогда и только тогда, если у вас есть закончен петля и еще не обнаружили фактора, можете ли вы заявить, что это должно быть простое.

Однако вам будет трудно преуспеть в написании этой логики, если вы установите все на плоском верхнем уровне, как вы это сделали. Проблема в том, что у вас нет возможности сделать правильный выход, когда вы находитесь на верхнем уровне. Поэтому ваша логика требует, чтобы вы положили все внутри функции, из которой вы можете сделать принудительный ранний выход, указав return.

В этом переписывании, я сделал это, плюс я использовал switch, который понятнее (и Swiftier), чем ваш if...else if:

func testForPrime(userInput:Int) { 
    switch userInput { 
    case 0: print("0 is not a prime number") 
    case 1: print("1 is not a prime number") 
    case 2: print("2 is a prime number") 
    default: 
     for i in 2..<userInput { 
      if userInput % i == 0 { 
       print("\(userInput) is not a prime number") 
       return 
      } 
     } 
     print("\(userInput) is a prime number") 
    } 
} 

А вот как проверить:

for i in 0...20 {testForPrime(i)} 

Выход:

0 is not a prime number 
1 is not a prime number 
2 is a prime number 
3 is a prime number 
4 is not a prime number 
5 is a prime number 
6 is not a prime number 
7 is a prime number 
8 is not a prime number 
9 is not a prime number 
10 is not a prime number 
11 is a prime number 
12 is not a prime number 
13 is a prime number 
14 is not a prime number 
15 is not a prime number 
16 is not a prime number 
17 is a prime number 
18 is not a prime number 
19 is a prime number 
20 is not a prime number 

(Также обратите внимание, что я использовал Swift-стиль для цикла вместо вашего C-стиля для цикла. Вы должны привыкнуть к стилю Swift, потому что скоро в C-стиле для цикла будет удален с языка.)

+0

Зачем им удалять C-стиль для цикла? Это будет в основном делать код, написанный в Swift, прежде чем больше не работать, если он использует цикл C-стиля. Язык должен всегда поддерживать более старые вызовы функций и синтаксис. Это не имеет смысла снимать все вместе, но вместо этого отказаться от его использования. –

+0

@ DanielH Сначала будет предупреждение, но в конечном итоге оно фактически будет полностью удалено. Мне тоже это не нравится, но это произойдет. У меня есть код, который я даже не уверен, как переписать без C-style for-loop. Но я должен буду это сделать. – matt

+0

Привет, ребята. Спасибо за ваш вклад! Я многому научился. – MartyJ

5

Удалить один из break заявления. Цикл должен работать полностью, пока не найдет условие, когда оно не является простым числом. Если это условие не найдено, это простое число.

var userInput = 9 

if userInput == 0 { 

    print("0 is not a prime number") 

} else if userInput == 1 { 

    print("1 is not a prime number") 

} else if userInput == 2 { 

    print("2 is a prime number") 

} else { 

    for var i = 2; i < userInput; i = i + 1 { 

     if userInput % i == 0 { 

      print("\(userInput) is not a prime number") 
      break 

     } else { 

      print("\(userInput) is a prime number") 
      // no break here 

     } 
    } 
} 

Или немного более полезным:

Логика встроена в функцию, так что вы можете использовать return для управления потоком вместо break. Потому что в конце есть return true, вам нужно искать только условия false. Если это не главное, вы используете return false для выхода из функции, и return true в конце никогда не будет вызван.

extension Int { 

    func isPrimeNumber() -> Bool { 

     switch self { 
     case 0 : return false 
     case 1 : return false 
     default : 
      for i in 2..<self { 
       if (self % i) == 0 { 
        return false 
       } 
      } 
     } 
     return true 
    } 
} 

userInput.isPrimeNumber() 

Функция помещается в расширение Int, так что вы можете просто вызвать функцию из userInput.

+2

Если вы улучшаете его код, вы можете просто использовать оператор' switch'. –

+2

@TimVermeulen true, и сделано –

1

Мои решения выглядят ужасно в окне комментариев. Я переклеил их здесь. Еще раз спасибо за вашу помощь!


var uI = 9 

var isPrime = true 

if uI == 0 || uI == 1 { 

    isPrime = false 

} 

for var i = 2; i < uI; i++ { 

    if uI % i == 0 { 

     isPrime = false 
    } 
} 

if isPrime { 

    print("\(uI) is prime!") 

} else { 

    print("\(uI) is not prime”) 

} 

var uI = 11 

var isPrime = true 

if uI == 0 || uI == 1 { 

    isPrime = false 

} 

var i = 2 

while i < uI { 

    if uI % i == 0 { 

     isPrime = false 

    } 
    i++ 

} 

if isPrime { 

    print("\(uI) is prime!”) 

} else { 

    print("\(uI) is not prime”) 

} 

Смежные вопросы