Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

iOS

Using for loop to write a prime number list in Swift

I am trying to take Amit's FizzBuzz challenge in "Swift Basics" one step further by writing a program that lists the prime numbers from 1-100. There must be a more efficient way to do this than the way I am doing it - and I cannot figure out how to include the numbers less than 10. See below:

import UIKit


let numbers = 1...100
for number in numbers {
        if (number % 2 == 0) {
            println(number)
        } else if (number % 3 == 0) {
            println(number)
        } else if (number % 4 == 0) {
            println(number)
        } else if (number % 5 == 0) {
            println(number)
        } else if (number % 6 == 0) {
            println(number)
        } else if (number % 7 == 0) {
            println(number)
        } else if (number % 8 == 0) {
            println(number)
        } else if (number % 9 == 0) {
            println(number)
        } else {
            println("Prime")
    }
}
}

6 Answers

Same version but cleaned up

import UIKit

let numbers = 1...100

for n in numbers {

    //set the flag to true initially
    var prime = true


    for var i = 2; i <= n - 1; i++ {

        //even division of a number thats not 1 or the number itself, not a prime number
        if n % i == 0 {
            prime = false
            break
        }
    }

    if prime == false {
        println("\(n) is not a prime number.")

    }  else {

        println("\(n) is a prime number.")

    }


}

yes that is not the way to go about doing it.

A prime number is only divisible by one and itself. If its divisible by any number between 1 and itself then it is not prime.

you just need to use 2 for loops. one to loop through your list of numbers, and one to see if any numbers between 2 and the number itself divide into it evenly. If a number between 2 and the number does divide evenly (without a remainder so the modulo would be 0) then its not prime

let numbers = 1...100

for number in numbers {

  //set the flag to true initially
  var prime = true

  for var i = 2; i <= number - 1; i++ {

      //even division of a number thats not 1 or the number itself = not a prime number
      if number % i == 0 {
          prime = false
          break
      }
  }

  if prime == false {
      println("\(number) is not prime.")

  }  else {

      println("\(number) is prime.")

   }


}

Here is good code for finding primes on swift 3:

func primes(n: Int) -> [Int] {
    var numbers = [Int](2 ..< n)
    for i in 0..<n - 2 {
        let prime = numbers[i]
        guard prime > 0 else { continue }
        for multiple in stride(from: 2 * prime - 2, to: n - 2, by: prime){
            numbers[multiple] = 0
        }
    }
    return numbers.filter{ $0 > 0 }

}

primes(n: 100)

Thank you both for your thoughts. But what happens when number = 1? Doesn't the algorithm crash because in the first iteration, 2 <= (2 - 1)? (which is false)? Or am I missing something very fundamental?

it wont crash. the loop just wont run any when the number is 1 since 2 <= (2 - 1) is false. the condition must be true for the loop to run .

I think the outer loop should start at 2 because 1 is not a prime number. 2 is the smallest prime number.

good point. I was thinking 1 is a prime number, but its not. If you wanted to print out all the numbers from 1 to 100 you could use an if statement to check for the number 1 since its a special case:

let numbers = 1...100

for number in numbers {

   if number == 1 {

      println("\(number) is not prime")

   } else {

    //set the flag to true initially
    var prime = true

    for var i = 2; i <= number - 1; i++ {

        //even division of a number thats not 1 or the number itself = not a prime number
        if number % i == 0 {
            prime = false
            break
        }
    }

    if prime == false {
        println("\(number) is not prime.")

    }  else {

        println("\(number) is prime.")

     }

   }


}

Thank you to both - that is very helpful

Hello Can you tell what exactly happens in this statement:

for var i = 2; i <= number - 1; i++ { //even division of a number thats not 1 or the number itself = not a prime number if number % i == 0 { prime = false break }

Thanks ;-)

// Prime Number without the use of boolean in Swift

var ranges = 1...100 for range in ranges { for ( var count = 2;count <= range;count++) { if range%count == 0 && count != range { println ("(range) is divisible by (count) hence it is not a prime number") break } else if (count == range) { println ("(range) is a prime number") } } }