-1

I created a simple primality test algorithm, but it fails for numbers like 15. Why?

number = int(input("Test if Prime: "))

print ("Is " + str(number) + " Prime?: ")

for i in range (2, number): 
  if number % i == 0: 
    print ("No")
    break
  else: 
    print ("Yes")

I tried an elif statement with other variations, but it still doesn't work:

number = int(input("Test if Prime: "))

print ("Is " + str(number) + " Prime?: ")

for i in range (2, number): 
  if number % i == 0: 
    break
  elif number % i != 0: 
    print ("Yes")

Any help is appreciated.

DarkRunner
  • 449
  • 4
  • 15

3 Answers3

1

You have your else condition inside the loop. At any point in time, it'll only check for one value...

Modifying your for loop to print out the number it is checking for:

for i in range (2, number): 
  print (i)
  if number % i == 0: 
    print ("No")
    break
  else: 
    print ("Yes")

prints out (for number = 15):

2
Yes
3
No

Which you know works if it prints out 'No' number - 1 times

To slightly modify what you did, we can just change it to:

flag = False
for i in range (2, number): 
  if number % i == 0: 
    print ("No")
    flag = True
    break
if (!flag)
  print("Yes")

All this does is push the print statement outside the loop (for a number to be prime it needs to be non-divisible by all numbers less than it). The flag ensures that you only print out True or False (you don't want to print out both)

Hiten
  • 248
  • 2
  • 9
  • flag is just a variable... you can rename it anything else. You call it flag as it is a 'flag' (in our case it tells us if a number is not prime) – Hiten Nov 06 '19 at 03:09
0

Here's a quick refactor I did based on your example:

def is_prime_simple(number):
    is_prime = True
    for i in range(2, number):
        if number % i == 0:
            is_prime = False
            break
    return is_prime

number = int(input("Test if Prime: "))

print ("Is " + str(number) + " Prime?: ")
print('Yes' if is_prime_simple(number) else 'No')

jayg_code
  • 571
  • 8
  • 21
0

due to wrong indentation, else will be will executed for all non-divisors of odd numbers

for i in range (2, number):
  if number % i == 0:
    print ("No")
      break
else: 
  print ("Yes")
Hiten
  • 248
  • 2
  • 9