My prime number finding code is trying all numbers so it will print the prime number a few times. Eg: 5/2 , 5/3, 5/4. So it will print 5 for 3 times.
def prime_number_generator(num):
for n in range (1,num):
for prime in range (2,n):
if (n%prime) ==0:
break
else:
yield n
number = input('Please input the number:')
if number.isnumeric():
num = int(number)
if num <= 2:
print('Number must be greater than 2')
else:
for prime in prime_number_generator(num):
print(prime, end=', ')
else:
print('Must be a positive integer')
Output with input as 27:
3, 5, 5, 5, 7, 7, 7, 7, 7, 9, 11, 11, 11, 11, 11, 11,
11, 11, 11, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
15, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
17, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
19, 19, 21, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
23, 23, 23, 23, 23, 23, 23, 23, 25, 25, 25,
CodePudding user response:
That's not your only problem. You are also (incorrectly) returning 15 as prime because you are immediately assuming that the number is prime if it can't be divided by 2 (the first iteration of your second for loop). Try this (note the indentation of the else):
def prime_number_generator(num):
for n in range (2, num):
for prime in range (2, n):
if (n % prime) == 0:
break
else:
yield n
See this question for an explanation of for..else construct in Python.
CodePudding user response:
The Problem
In this function:
def prime_number_generator(num):
for n in range (1,num):
for prime in range (2,n):
if (n%prime) ==0:
break
else:
yield n
You are yielding n if it is not exactly divisible by prime. Here is an example for what happens when n = 5:
- First,
prime = 2.n % prime != 0, son, i.e,5is yielded - Then,
prime = 3.n % prime != 0, so5is, once again, yielded - Then,
prime = 4,n % prime != 0, so5is, once again, yielded - Finally,
prime = 5.n % prime == 0, so the loop is broken.
This process is then repeated with the next n
How to fix
You can remove the else clause from the if, and add it to the for loop. This means that n will be yielded only if the for loop was not broken, that is, only if n is not divisible by any number between 2 and n - 1.
So you can rewrite your function like this:
def prime_number_generator(num):
for n in range (1, num):
for prime in range (2, n):
if (n % prime) == 0:
break
else:
yield n
CodePudding user response:
def is_prime(n):
for i in range(2, n):
if n % i == 0:
return False
else:
return True
def get_prime_numbers(n):
for i in range(2, n):
if is_prime(i):
yield i
prime_numers = [prime for prime in get_prime_numbers(20)]
print(prime_numers)
