Проблема с кодом, который принимает 2 положительных числа и печатает каждое простое число между ними?- Свифт - PullRequest
0 голосов
/ 24 июня 2019

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

func printPrimes(from firstNum: Int, to lastNum: Int) {
    var newFirstNum = firstNum
    if firstNum == 0 {
        newFirstNum = 2
    }


    let numbers = newFirstNum...lastNum


    // Goes through each number from 2-100 starting from 2.
    for number in numbers {

        var primeValue = false
        let startPoint = 2

        let number2 = startPoint...number

        // Takes current number and divides by every number from 2 to the given number.
        for currentIndex in number2 {
            primeValue = false
            if number % currentIndex != 0 {
                primeValue = true
            }
        }
            if primeValue == false {
                print("\(number) is not prime")

            } else {
                print("\(number) is prime")
            } 
    } 
}

Это тип вызова функции, который я использую:

printPrimes(from: 0, to: 100)

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 24 июня 2019

Несколько вопросов.В основном, все настройки primeValue неверны.Сначала вы установите его в ложь.Затем вы сбрасываете его в false для каждого фактора, который собираетесь попробовать, даже если вы уже определили, что число простое.

Было бы лучше предположить, что число простое, пока не будет найден фактор.И вам нужно избегать сверки номера с самим собой.

Вот ваш фиксированный код:

func printPrimes(from firstNum: Int, to lastNum: Int) {
    var newFirstNum = firstNum
    if firstNum == 0 {
        newFirstNum = 2
    }

    let numbers = newFirstNum...lastNum

    // Goes through each number from 2-100 starting from 2.
    for number in numbers {
        var primeValue = true // assume prime unless we find a factor
        let startPoint = 2

        let number2 = startPoint..<number // Don't include number

        // Takes current number and divides by every number from 2 to the given number.
        for currentIndex in number2 {
            if number % currentIndex == 0 {
                primeValue = false // we found a factor, not prime
                break // no need to check for any other factors
            }
        }

        if primeValue {
            print("\(number) is prime")
        } else {
            print("\(number) is not prime")
        }
    }
}

printPrimes(from: 0, to: 100)
...