How do I break an infinite Python loop? - python

I'm looking to fix the following code, so that it can finish successfully for all numbers listed. How can I break the infinite loop that's present?
Furthermore, how can I return print(is_power_of_two(8)) as True?
# Check if the number can be divided by two without a remainder
while n % 2 == 0:
n = n / 2
# If after dividing by two the number is 1, it's a power of two
if n == 1:
return True
return False
print(is_power_of_two(0)) # Should be False
print(is_power_of_two(1)) # Should be True
print(is_power_of_two(8)) # Should be True
print(is_power_of_two(9)) # Should be False

your while condition should be :
# Check if the number can be divided by two without a remainder
while n % 2 == 0 and n >1:
n = n / 2
cause for the moment your code infinitely loops when n=1 cause 1%2 = 1

Add and n != 0 to the while condition, so the loop will halt when n is zero.

def is_power_of_two(n):
# Check if the number can be divided by two without a remainder
while n!=0 and (n % 2 == 0 or 2%n==0):
n = n / 2
return True
return False

import math
math.log2(number).is_integer()
Use this. From Check if a given number is power of two in Python

def is_power_of_two(n):
#Check Number for Zero
if n==0:
return False
else:
# Check if the number can be divided by two without a remainder
while n % 2 == 0:
n = n / 2
# If after dividing by two the number is 1, it's a power of two
if n == 1:
return True
return False

def is_power_of_two(n):
# Check if the number can be divided by two without a remainder
while n % 2 == 0 and n!=0:
n = n / 2
# If after dividing by two the number is 1, it's a power of two
if n == 1:
return True
return False
print(is_power_of_two(0)) # Should be False
print(is_power_of_two(1)) # Should be True
print(is_power_of_two(8)) # Should be True
print(is_power_of_two(9)) # Should be False

Related

Python begginer - Can someone tell me why this loop don't finish?

def is_power_of_two(n):
# Check if the number can be divided by two without a remainder
while n % 2 == 0:
n = n / 2
# If after dividing by two the number is 1, it's a power of two
if n == 1:
return True
if n != 0:
return False
print(is_power_of_two(0)) # Should be False
print(is_power_of_two(1)) # Should be True
print(is_power_of_two(8)) # Should be True
print(is_power_of_two(9)) # Should be False
This is a excercice from Coursera's Python course. I don't know why it don't finish when n=0.
while n % 2 == 0: will turns out to be a infinate loop.
This happening because
First number input is 0
while n % 2 == 0: ---> 0 ==0 --> True
While True:
#This is infinate loop.
Code correction
To avoid this check if n is zero or not before while.
def is_power_of_two(n):
if n ==0:
return False
# Check if the number can be divided by two without a remainder
while n % 2 == 0:
n = n / 2
# If after dividing by two the number is 1, it's a power of two
if n == 1:
return True
if n != 0:
return False
print(is_power_of_two(0)) # Should be False
print(is_power_of_two(1)) # Should be True
print(is_power_of_two(8)) # Should be True
print(is_power_of_two(9)) # Should be False
Gives #
False
True
True
False

How to properly check if a number is a prime number

Hey so i have this function to check if a number is a prime number
def is_prime(n):
flag = True
for i in range(2, n ):
if (n % i) == 0:
flag = False
return flag
print(is_prime(1))
However when i test the number 1, it skips the for loop and returns True which isn't correct because 1 is not a prime number.
How could i fix this?
You can first start by checking if n is greater than 1 the code should proceed, else it should return False. If n passes the first condition, only then the code can proceed to verify if n is indeed prime or not.
def is_prime(n):
flag = True
if n > 1:
for i in range(2, n ):
if (n % i) == 0:
flag = False
return flag # Returns this flag after check whether n is prime or not
# Returns False if n <= 1
return False
print(is_prime(1))
output:
False
2 is also skipped by the loop, but the function returns true thanks to the flag, and we know that's right.
Also you can exit early the loop if the condition is met:
def is_prime(n: int) -> bool:
if n > 1:
for i in range(2, n): # if n == 2, there is no loop, is never checked
if (n % i) == 0:
return False # can return early once we meet the condition, don't need to finish the loop
return True
print(is_prime(7534322224))
print(is_prime(5))
An alternative approach (though much slower on bigger numbers):
def is_prime(n: int) -> bool:
if n < 2: return False
return n == 2 or True not in [True for i in range(2, n) if (n % i) == 0]
print(is_prime(75343224))
print(is_prime(5))

why is 3 not prime number?

Function to identify is n prime or not.
def test_prime(n):
if n == 1:
return False
elif n==2:
return True
else:
for e in range(2,n): # iteration from 2 to n
if e % 2 == 0:
return False
return True
Why is 3 not prime number here?
print(test_prime(3))
That is because the logic you have implemented is wrong. As it is already pointed out, your code currently is checking whether or not your input number is even or odd. For checking if the number is prime, you can do as follows:
def test_prime(n):
if n == 1:
return False
elif n==2:
return True
else:
for e in range(2,n): # iteration from 2 to n
if n % e == 0:
return False
return True
The else condition will check whether the remainder after dividing the input number by each number in range is 0 or not. If it's 0 then it's not a prime number. Also, you could run the loop from 0 to half of n, which is more efficient as suggested.
Number 3 is not prime number because of the logic in the code which goes from range(2,n), what will return number 2 and 2%2 == 0 which is False.

Can't define 2 as prime number or not

I'm trying to define prime numbers, but my algorithm doesn't recognize 2 as a prime number. Instead return None. I try it in Google Colab, Jupiter Notebook and PyCharm with same result.
My code:
# V1) Test all divisors from 2 through n-1. (skip 1 and n)
def is_prime_v1(n):
""" Return 'True' if 'n' is a prime number. False otherwise. """
if n == 1:
return False # 1 is not prime
for d in range(2, n):
if n % d == 0:
return False # Is not prime
return True
# ===== Test Function =====
for n in range(1, 21):
print(n, is_prime_v1(n))
My output:
1 False
2 None
3 True
4 False
5 True
6 False
7 True
8 False
9 True
10 False
11 True
12 False
13 True
14 False
15 True
16 False
17 True
18 False
19 True
20 False
Additionally, the return has some erros, like 9 is not a prime number.
This code is from, starting in 0:46: Python and Prime Numbers || Python Tutorial || Learn Python Programming
Because Your program never enters the loop.
for d in range(2, n):
if n % d == 0:
return False # Is not prime
return True
starts from 2, up until n-1.
Also, you should indent it differently. Only after your program exited the loop should you return True:
for d in range(2, n):
if n % d == 0:
return False # Is not prime
return True
But if you want to optimize your function, it should be like this:
def is_prime_v1(n):
if n <= 1:
return False
if n == 2:
return True
if n % 2 == 0:
return False
for d in range(3, round(n**0.5) + 1, 2):
if n % d == 0:
return False
return True
Since you dont need to check up to the number itself, only it's square root.
Also, no number that is even can ever be prime (except 2), since it would be divisible by two.
EDIT:
I'm happy my answer helped :)
You can explicitly define 2 as prime.
The return True is inside your for loop and so is returning true after just 1 iteration (which is why you have errors).
For primes, it suffices to check only up to the square root of the number you are testing, this should speed things up considerably for large n.
Try this
def is_prime_v1(n):
""" Return 'True' if 'n' is a prime number. False otherwise. """
if n == 1:
return False # 1 is not prime
elif n == 2:
return True
for d in range(2, int(n**0.5) + 1):
if n % d == 0:
return False # Is not prime
return True
for d in range(2, n):
if n % d == 0:
return False # Is not prime
return True
Create a separate if for it like you did for 1.
if n == 2:
return True #2 is prime

determining if random Int is prime or not

I have a little problem when i need to determine if a number , x is a prime number or not.
x will be a randomly generated positive integer and i get the following message when i execute code:
Your function fails on is_prime(2). It returns None when it should return True.
My code:
def is_prime(x):
if x < 2:
return False
else:
for n in range(2, x):
while x % n == 0:
return False
break
else:
return True
i want the while loop to iterate through n == 2 up to n == (x-1) but it doesnt seem to do it!
what am i doing wrong?
You could write this function much more simplier:
import math
def is_prime(n):
if n % 2 == 0 and n > 2:
return False
for i in range(3, int(math.sqrt(n)) + 1, 2):
if n % i == 0:
return False
return True
So your call for is_prime(2) wouldn't pass the if test and wouldn't be used in the for run and would just return True.
All other prime numbers should be tested if they are greater than 3 and not even.

Categories