renzen - 1 year ago 116
Python Question

# Python script for finding keith numbers not working

I am trying to make a python program that will find keith numbers. If you don't what keith numbers are, here is a link explaining them:
Keith Numbers - Wolfram MathWorld

My code is

``````from decimal import Decimal
from time import sleep

activator1 = 1

while (activator1 == 1):
try:
limit = int(raw_input("How many digits do you want me to stop at?"))
activator1 = 0
except ValueError:
print "You did not enter an integer"

limitlist = []
activator2 = 1

while (activator2 <= limit):
limitlist.append(activator2)
activator2 += 1
print limitlist

count = 9
while 1:
sleep (0.1)

numbers = list(str(count))

for i in limitlist:
if (i > 0) & (add < count):
add = sum(Decimal(i) for i in numbers)
lastnumber = int(numbers[-1])
numbers.reverse()
numbers.pop()
print count
print numbers
print"________________________________"
print count

elif (i > 0) & (add > count):
count += 1
break
``````

It doesn't output any errors but it just outputs

``````18
9
9
[18]
``````

Could someone please tell me why it doesn't just repeatedly find Keith numbers within the number of integers range?

Prune has already given you good advices! Let's put a little example of what he meant though, let's say you got an algorithm which determine whether n is a keith number or not and also a test loop to print some keith numbers:

``````def keith_number(n):
c = str(n)
a = list(map(int, c))
b = sum(a)

while b < n:
a = a[1:] + [b]
b = sum(a)

return (b == n) & (len(c) > 1)

N = 5
for i in range(N):
a, b = 10**i, 10**(i + 1)
print("[{0},{1}]".format(a, b))
print([i for i in filter(keith_number, range(a, b))])
print('-' * 80)
``````

such snippet gives you this:

``````[1,10]
[]
--------------------------------------------------------------------------------
[10,100]
[14, 19, 28, 47, 61, 75]
--------------------------------------------------------------------------------
[100,1000]
[197, 742]
--------------------------------------------------------------------------------
[1000,10000]
[1104, 1537, 2208, 2580, 3684, 4788, 7385, 7647, 7909]
--------------------------------------------------------------------------------
[10000,100000]
[31331, 34285, 34348, 55604, 62662, 86935, 93993]
--------------------------------------------------------------------------------
``````

Wow, that's awesome... but wait, let's say you don't understand the keith_number function and you want to explore a little bit the algorithm in order to understand its guts. What about if we add some useful debug lines?

``````def keith_number(n):
c = str(n)
a = list(map(int, c))
b = sum(a)
print("{0} = {1}".format("+".join(map(str, a)), b))

while b < n:
a = a[1:] + [b]
b = sum(a)
print("{0} = {1}".format("+".join(map(str, a)), b))

return (b == n) & (len(c) > 1)

keith_number(14)
print '-' * 80
keith_number(15)
``````

that way you'll be able to trace the important steps and the algorithm will make sense in your head:

``````1+4 = 5
4+5 = 9
5+9 = 14
--------------------------------------------------------------------------------
1+5 = 6
5+6 = 11
6+11 = 17
``````