I'm trying to do the Collatz conjecture on a list of numbers to check which one is "holding" the most. the problem is the code keeps telling me "TypeError: unsupported operand type(s) for %: 'list' and 'int'"
Collatz = range(1, 1001)
counting = 0
print(Collatz)
while Collatz != 1:
if Collatz % 2 == 0:
Collatz = int(Collatz / 2)
print(Collatz)
counting = 1
else:
Collatz = int(Collatz * 3 1)
print(Collatz)
counting = 1
print(counting)
if it's with input it works great... Would appreciate help :)
try to get a list of all of the ranges, with a number and how long it took to get to "1" or just which one is the longest. for example: number 1 took 1 steps to get to "1" number 2 took 2 steps to get to "1" number 3 took 8 steps to get to "1" etc
or
number 153 took 736 steps to get to "1" (IDK, just for the example)
CodePudding user response:
This code will work:
def get_collatz(n):
i=1
while True:
if n % 2 == 0:
n /= 2
else:
n = 3 * n 1
if n == 1:
return(i)
i = 1
for i in range(1, 100000):
print(i, get_collatz(i))
If you want to know the number that took most steps, you can do this:
steps = dict()
for i in range(1, 100000):
steps[i] = get_collatz(i)
n_max = max(steps, key=steps.get)
total_steps = steps[n_max]
print(f'Number {n_max} took {total_steps} steps to reach 1.')
This prints:
Number 77031 took 350 steps to reach 1.
You can also create a sorted dictionary:
sorted_steps = dict(sorted(steps.items(), key=lambda item: item[1]))
CodePudding user response:
When you use range()
you get a list of numbers in that range. Did you mean number
instead of Collatz
because in the for loop you are looping through the Collatz
and the value is in number
. And while loop isn't doing anything so I recommend removing it.
Use this code:
Collatz = range(1, 1001)
counting = 0
for number in Collatz:
if number % 2 == 0:
number = int(number / 2)
print(number)
counting = 1
else:
number = int(number * 3 1)
print(number)
counting = 1
print(counting)