Печать простых чисел из диапазона 2 ... 100 - PullRequest
0 голосов
/ 27 марта 2019

Мне было поручено распечатать простые числа из диапазона 2 ... 100.Мне удалось получить большинство простых чисел, но я не могу понять, как избавиться от 9 и 15, в основном, кратных 3 и 5. Пожалуйста, дайте мне ваше предложение о том, как я могу это исправить.

for n in 2...20 {
    if n % 2 == 0 && n < 3{
        print(n)
    } else if n % 2 == 1 {
        print(n)
    } else if n % 3 == 0 && n > 6  {
    }
}

Это то, что он печатает до сих пор:

2
3
5
7
9
11
13
15
17
19

Ответы [ 3 ]

4 голосов
/ 27 марта 2019

Ваш "алгоритм" неверен. Вы должны хранить где-нибудь свои простые числа, а затем просто проверить, удовлетворяет ли n условию n % prime != 0 для каждого простого числа. Если это так, просто добавьте это n к массиву простых чисел и переходите к следующему n.

Начиная с Swift 4.2, вы можете использовать этот очень простой алгоритм, используя allSatisfy

var primes = [Int]()

for n in 2...100 {
    if primes.allSatisfy({ n % $0 != 0 }) {
        primes.append(n)
    }
}

print(primes) // [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

Или вы можете реализовать более эффективный алгоритм Сито Эратосфена .

Ниже моя простая реализация (есть более эффективные решения)

var range = [Int](2...100)
var p = 0

while true {
    guard let newPrimeIndex = range.firstIndex(where: { $0 > p }) else { break }
    p = range[newPrimeIndex]
    range.removeAll(where: { $0 % p == 0 && $0 != p })
}

print(range) // [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
0 голосов
/ 27 марта 2019

Сделано для Swift 5

В отличие от других ответов, это легко масштабируется . Я не включил заранее составленный список простых чисел, который не будет работать для очень больших чисел , которые не были включены.

Вот алгоритм, который я придумал. Я сделал это настолько эффективно, насколько смог, с учетом того, что факторы повышаются только до floor из square root из number. Это сокращает время сравнения факторов, которые никогда не сработают.

import Foundation


// Function to determine whether a number is prime
func isPrime(_ num: Int) -> Bool {
    let max = Int(floor(sqrt(Double(num))))
    guard max >= 2 else { return true }

    for factor in 2...max {
        if num.isMultiple(of: factor) { // Write num % factor == 0 for older versions of Swift
            return false
        }
    }

    return true
}


// Find if a number is prime for numbers 2 to 200
for i in 2...100 {
    if isPrime(i) {
        print(i)
    }
}
0 голосов
/ 27 марта 2019

Я наконец понял это, лол, Это может быть не красиво, но это работает, ха-ха, Спасибо за ответ каждого.Я выложу то, что придумал, если, возможно, это кому-нибудь еще поможет.

for n in 2...100 {
    if n % 2 == 0 && n < 3{
        print(n)
    } else if n % 3 == 0 && n > 6 {
    } else if n % 5 == 0 && n > 5 {
    } else if n % 7 == 0 && n > 7{
    } else if n % 2 == 1 {
        print(n)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...