36 lines
772 B
Python
36 lines
772 B
Python
class DigitSumer :
|
|
def __init__(self):
|
|
sumdigit = lambda n : sum( map( int,str( n )))
|
|
self.t = [sumdigit( i ) for i in xrange( 10000 )]
|
|
def __call__ ( self,n ):
|
|
r = 0
|
|
while n >= 10000 :
|
|
n,q = divmod( n,10000 )
|
|
r += self.t[q]
|
|
return r + self.t[n]
|
|
|
|
|
|
def self_numbers ():
|
|
d = DigitSumer()
|
|
s = set([])
|
|
i = 1
|
|
while 1 :
|
|
n = i + d( i )
|
|
if i in s :
|
|
s.discard( i )
|
|
else:
|
|
yield i
|
|
s.add( n )
|
|
i += 1
|
|
|
|
import time
|
|
p = 100
|
|
t = time.time()
|
|
for i,s in enumerate( self_numbers(),1 ):
|
|
if i <= 50 :
|
|
print s,
|
|
if i == 50 : print
|
|
if i == p :
|
|
print '%7.1f sec %9dth = %d'%( time.time()-t,i,s )
|
|
p *= 10
|