Factorization: What went wrong with d? [duplicate] - python

This question already has answers here:
What is a debugger and how can it help me diagnose problems?
(2 answers)
Closed 2 years ago.
Consider:
Enter image description here
Input: 20
17
999997
Output: 2^2 * 5
17
757 * 1321
My code:
a = int(input())
# Find the factors first
for i in range(2, a+1):
s = 0
b = a
d = 0
# See if it is a prime number
if a%i == 0:
for x in range(1, i+1):
if a%x == 0:
d = d + x
if (d-1)/i == 1:
d = 0
print(i)
else:
s = 0
b = a
d = 0
continue
d = 0
# I will see how many prime numbers
while(b>0):
if (b/i)%1 == 0:
s = s + 1
b = b/i
else:
b = 0
if b == 1:
b = 0
print(s)
I will find the factors first, and then see if it is a prime number. If so, I will see how many prime numbers it is
if i input 12, it outputs 2 2
Enter link description here

I believe you need the output of the following.
import math
a = int(input())
while (a % 2 == 0):
print(2)
a = int(a/2)
while (a % 3 == 0):
print(3)
a = int(a/3)
for i in range(5, math.ceil(math.sqrt(a)), 6):
while (a % i == 0):
print(i)
a = int(a / i)
while (a % (i + 2) == 0):
print(i + 2)
a = int(a / (i + 2))
if (a > 3):
print(a)
This will give you the prime factors for a given number. As I can understand, it is what you are looking for.

a = int(input("Enter a number:"))
for i in range(2, a + 1):
if a % i != 0:
continue
# SETTING THE DEFAULT VALUES AT THE BEGINNING OF EVERY ITERATION OF THE LOOP
s = 0
b = a
d = 0
for x in range(1, i + 1):
if b % x == 0:
d = d + x
if (d - 1) / i == 1:
d = 0
print(i)
else:
# s = 0 # NO LONGER NEEDED, AS WE RESET THEM AT THE BEGINNING OF THE LOOP
# b = a
# d = 0
continue
while b > 0:
if (b / i) % 1 == 0:
s = s + 1
b = b / i
else:
b = 0
if b == 1:
b = 0
print(s)
a /= i**s # THIS LINE IS IMPORTANT
You were close. You forgot to set the default values at the beginning of every iteration of the loop, so they sometimes didn't have the right values ; and you should set a to a different value by dividing it by the factor you found (i**s, so i to the power of s).
As has been mentioned, your code also follows an odd coding style. I suggest you stop putting newlines between each statement, and start separating operators with spaces (example: range(3+5) is bad, range(3 + 5) is more readable)

You are using too many loops here and that's why you are getting too much confused. Here is the code which serve the same purpose (if I understand your problem correctly)
a = int(input("Enter a number: "))
i = 2
factors = []
while i <= a:
if (a%i) == 0:
factors.append(i)
a = a/i
else:
i = i + 1
print(factors)
here I am returning a list, if you want you can change the type accordingly.
Here are the inputs/outputs:
Enter a number: 17
[17]
Enter a number: 100
[2, 2, 5, 5]
Enter a number: 12
[2, 2, 3]

Related

Is there a way I can compare the same variable and choose the higher one and print it?

The value of y is changing every time the while loops continues, I tried the watchpoints modules but I need a way to find out the highest y has ever been and print it, I'll print the code that I'm trying to get to work.
import random
from watchpoints import watch
def alg(I):
print(I)
x = 1
while i > 1:
if (i % 2) == 0:
i = int(i / 2)
x = x + 1
else:
i = int(3 * i + 1)
x = x + 1
print(I)
y = 1
if i in range(1, 9):
y = 1
if i in range(10, 99):
y = 2
if i in range(100, 999):
y = 3
if i in range(1000, 9999):
y = 4
watch(a)#I want to know when y reachest the highest
print(y, "is the max number of caracters")#then print it
print("numero passaggi = ", str(x))
print("1: choice")
print("2: random")
type = int(input(" 1 or 2: "))
if type == 1:
i = input("Enter a number: ")
alg(int(I))
elif type == 2:
i = random.randint(1, 100) # 10^9
alg(I)
else:
print("Enter 1 or 2")
I want to know when y reaches the highest and print it below.
There are many ways to do this, but since you seem interested in "watching" the values of y as they change, one good option might be to make your alg function a generator that yields the values of y. The caller can then do whatever it wants with those values, including taking the max of them.
Note that instead of doing this kind of thing to figure out how many digits a number has:
if i in range(1, 9):
y = 1
if i in range(10, 99):
y = 2
if i in range(100, 999):
y = 3
if i in range(1000, 9999):
y = 4
you can just do:
y = len(str(i))
i.e. turn it into a string and then count the characters.
def alg(i: int):
x = 1
while i > 1:
if i % 2 == 0:
i = i // 2
x += 1
else:
i = 3 * i + 1
x = x + 1
print(f"i: {i}")
yield len(str(i))
print(f"numero passaggi = {x}")
print(f"Max number of digits: {max(alg(50))}")
i: 25
i: 76
i: 38
i: 19
i: 58
i: 29
i: 88
i: 44
i: 22
i: 11
i: 34
i: 17
i: 52
i: 26
i: 13
i: 40
i: 20
i: 10
i: 5
i: 16
i: 8
i: 4
i: 2
i: 1
numero passaggi = 25
Max number of digits: 2
The simplest method would be to create another variable to store the highest value that y has achieved and run a check each loop to see if the new y value is larger than the previous max.
Here is an example:
def exampleFunc():
i = 0
y = yMax = 0
while i < 20:
y = random.randint(1, 100)
if y > yMax:
yMax = y
i += 1
print(yMax)
The easiest way to approach something like this is to transform your function into one that returns all intermediate values, and then aggregate those (in this case, using the builtin max()).
from math import log10
def collatz_seq(n):
yield n
while n > 1:
if n % 2:
n = 3 * n + 1
else:
n //= 2
yield n
def print_stats(n):
seq = collatz_seq(n)
idx, val = max(enumerate(seq), key=lambda x: x[1])
digits = int(log10(val)) + 1
print(f"{digits} is the max number digits")
print(f"{idx} is the iteration number")
Here I use enumerate() to give me the index of each value, and I use math.log10() to obtain the number of digits in the number (minus one).

To find if a number is fibonacci or not

I am a student, new to python. I am trying to code a program that will tell if a user input number is fibonacci or not.
num=int(input("Enter the number you want to check\n"))
temp=1
k=0
a=0
summ=0
while summ<=num:
summ=temp+k
temp=summ
k=temp
if summ==num:
a=a+1
print("Yes. {} is a fibonnaci number".format(num))
break
if a==0:
print("No. {} is NOT a fibonacci number".format(num))
#The program is working for only numbers upto 2.
You don't need quite so many variables. A Fibonacci integer sequence can be generated with the single assignment
a, b = b, a + b
# Short for
# temp = a
# a = b
# b = temp + b
Repeated applications sets a to the numbers in the pattern in sequence. The choice of initial values for a and b determine which exact sequence you get. The Fibonacci numbers are generated when a = 0 and b = 1 are used.
a = 0
b = 1
a, b = 1, 0 + 1 # 0, 1
a, b = 1, 1 + 1 # 1, 2
a, b = 2, 1 + 2 # 2, 3
a, b = 3, 2 + 3 # 3, 5
# etc
(As another example, the Lucas numbers are generated if you start with a = 2 and b = 1.)
All you need to do is return True if n == a at each step, iterating until n > a. If n wasn't one of the a values generated by the loop, you'll return False.
n = int(input(...))
a = 0
b = 1
while a <= n:
if n == a:
return True
a, b = b, a + b
return False
I'd suggest something like this:
fib_terms = [0, 1] # first two fibonacci terms
user_input= int(input('Enter the number you want to check\n'))
# Add new fibonacci terms until the user_input is reached
while fib_terms[-1] <= user_input:
fib_terms.append(fib_terms[-1] + fib_terms[-2])
if user_input in fib_terms:
print(f'Yes. {user_input} is a fibonacci number.')
else:
print(f'No. {user_input} is NOT a fibonacci number.')
Check this:
def fibonacci_list(limit):
u_n_1 = 1
u_n_2 = 1
u_n = 1
out_list = [u_n]
while u_n <= limit:
out_list.append(u_n)
u_n = u_n_1 + u_n_2
u_n_2 = u_n_1
u_n_1 = u_n
return out_list
def is_fibonacci_number(n):
if n in fibonacci_list(n):
return True
return False
def main():
n = int(input('Enter a number:'))
if is_fibonacci_number(n):
print(str(n) + ' is a fibonacci number ')
else:
print(str(n) + ' is not a fibonacci number ')
if __name__ == '__main__':
main()
bool checkfibonacci(int n)
{
int a = 0;
int b = 1;
if (n == a || n == b) return true;
int c = a + b;
while(c <= n)
{
if(c == n) return true;
a = b;
b = c;
c = a + b;
}
return false;
}
Something like this will do it.
welcome to the python community.
In Your code temp means the previous number and k means the previous number of temp. The problem is that you change the temp before you assign the next value to k. To solve that you just have to sawp the lines 8 and 9. In the new order you first assign the value of temp to k then summ to temp. That's it!
I suggest you to do it by a list in this way:
fib[i] = fib[i-1] + fib[i-2]
It will improve the clarity of your code.

How can you sum these outputs in Python?

I made this code about a number and it's power. It will ask a number and it's power and show the output like a horizontal list.. Like
Number = 2
Power = 3.... then output will be like=
1
2
4
Number and power can be +/-.
But I want to sum those numbers like Sum = 7 after it shows
1
2
4
I have no idea how to do it after the output. I am new to programming maybe that's why can't figure out this problem.
Here is the code in Python :
A =float(input("Number:"))
B =float(input("Power:"))
print("Result of Powers:")
i = 0
while i < B:
print(A**i)
i = i + 1
while i >= B:
print(A**i)
i = i - 1
You could simplify this with numpy as follows
import numpy as np
A =float(input("Number:"))
B =int(input("Power:"))
print("Result of Powers:")
power = np.arange(B)
power_result = A ** power
sum_result = np.sum(power_result)
print(power_result)
print(sum_result)
I made B into an int, since I guess it makes sense. Have a look into the numpy documentation to see, what individual functions do.
You can create another variable to store the sum
and to print values on the same line use end=" " argument in the print function
a = float(input("Number:"))
b = int(input("Power:"))
sum = 0.0
i = 0
while b < 0:
ans = a**i
i = i - 1
print(ans, end=" ")
sum = sum + ans
b += 1
while b >= 0:
ans = a**i
i = i + 1
print(ans, end=" ")
sum = sum + ans
b -= 1
print("\nSum = " + str(sum))
I'm not sure what you want to achieve with the second loop. This works:
A =float(input("Number:"))
B =float(input("Power:"))
print("Result of Powers:")
i = 0
n_sum = 0
while i < B:
n_sum += A**i
print(A**i)
i = i + 1
while i >= B:
n_sum += A**i
print(A**i)
i = i - 1
print(n_sum)

Why is the entire loop code is being ignored?

The block of loop code is ignored and only the initial value is being used. It works well till I input fin and then simply the value 0 (as I have initialised it like that) is output as shown in the code.
I'm trying to make a very basic voting system with numbers as input.
z = 0
a = 0
b = 0
while z != 'fin':
n = input()
if n == 1:
a = int(a) + 1
elif n == 2:
b = int(b) + 1
else:
pass
z = n
c = 'kushagra'
d = 'kunaal'
print(f"{c} got {a} votes.\n{d} got {b} votes")
Like Mad Physicist said, n is a string not a number.
I changed the code to this :
z = 0
a = 0
b = 0
while z != 'fin':
n = input()
if n == '1':
a += 1
elif n == '2':
b += 1
else:
pass
z = n
c = 'kushagra'
d = 'kunaal'
print(f"{c} got {a} votes.\n{d} got {b} votes")
And it seems to work.

Python: Reversing print order from a while loop

I am writing some code takes values, the values number and N as input and prints, the first N lines of a multiplication table as below:
3 * 4 = 12
2 * 4 = 8
1 * 4 = 4
What I'd like to do is reverse said output to look like this:
1 * 4 = 4
2 * 4 = 8
3 * 4 = 12
The code is here below. I've thought about using slicing such as [:-1] but I'm not sure how to implement it. Assistance would be appreciated. Thanks.
number = input("Enter the number for 'number ': ")
N = input("Enter the number for 'N': ")
if number .isdigit() and N.isdigit():
number = int(number )
N = int(N)
while int(N) > 0:
print('{} * {} = {}'.format(N,number ,N*number))
N = N - 1
else:
print ('Invalid input')
I would instead recommend using a for loop with the range method as such:
for i in range(1, N+1):
print('{} * {} = {}'.format(i,number ,i*number)
I think, you can let the program count upwards.
N = int(N)
i = 1
while int(N) >= i:
print('{} * {} = {}'.format(N,number ,N*number)) # TODO: adjust formula
i = i + 1
Reversing a list is [::-1] (you missed ':') and you are parsing twice the same number N, but in this case you can do
counter = 0
while counter != N:
print('{} * {} = {}'.format(N,number ,N*number))
counter = counter + 1
You could change your while loop like so:
int i = 0
while i < N:
print('{} * {} = {}'.format(i,number ,i*number))
i = i + 1
If you absolutely have to do it using while loops, perhaps something like the following will work.
m = 1
while m <= N:
#Do stuff with m
m += 1
Although I much suggest using a for loop instead.

Categories