A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with denominators 2 to 10 are given:
1/2 = 0.5 1/3 = 0.(3) 1/4 = 0.25 1/5 = 0.2 1/6 = 0.1(6) 1/7 = 0.(142857) 1/8 = 0.125 1/9 = 0.(1) 1/10 = 0.1
Where 0.1(6) means 0.166666..., and has a 1-digit recurring cycle. It can be seen that 1/7 has a 6-digit recurring cycle.
Find the value of d 1000 for which 1/d contains
the longest recurring cycle in its decimal fraction part.
#encoding=utf-8
def recursivelist(num1,num,tempcount=20):
#num1被除数,num除数
templist=recursive(num1,num,tempcount)
if len(templist)<tempcount:
return 0,[]
else:
flag=False
for tempindex,tempvalue in enumerate(templist[1:]):
tempindex=tempindex+1
tempstart=0
while 1:#遍历在当前索引之前是否有存在循环部分
if tempstart==tempindex:
break
if tempvalue in templist[tempstart:tempindex]:
comindex=templist.index(tempvalue,tempstart,tempindex)#前一个可能为循环Before头的索引
tempstart=tempstart+1
if templist[comindex:tempindex]==templist[tempindex:2*tempindex-comindex] :#判断循环Before与当前开始的循环After是不是相同,
if len(set([''.join([str(inttemp) for inttemp in templist[sliceindex:sliceindex+tempindex-comindex]]) for sliceindex in xrange(tempindex,tempcount,tempindex-comindex)] ))==1:#判断是不是只有一个循环部分
return len(templist[comindex:tempindex]),templist[comindex:tempindex]
else:
break
return recursivelist(num1,num,tempcount*2)#如果当前没有找到循环部分
def recursive(num1,num2,tempcount):
"""
尝试获取tempcount位小数
num1,被除数
num2除数
"""
relist=[]
while 1:
if tempcount==0:
break
sha,num1=divmod(num1*10,num2)
relist.append(sha)
if not num1:
break
tempcount-=1
return relist
#print recursivelist(1,7)
import datetime
start_time=datetime.datetime.now()
maxnum,maxcount,maxlist=0,0,[]
for num in xrange(1,1000):
#print num
tempcount,templist=recursivelist(1,num,(num+9)/10*10*2)
if tempcount>maxcount:
maxnum,maxcount,maxlist=num,tempcount,templist
print maxnum,maxcount,maxlist
end_time=datetime.datetime.now()
print end_time-start_time
结果:983 982 [1, 2, 0, 0, 4, 0, 6, 9, 1, 7, 5, 9, 9, 1, 8, 6, 1, 6, 4, 8, 0, 1, 6, 2, 7, 6, 7, 0, 3, 9, 6, 7, 4, 4, 6, 5, 9, 2, 0, 6, 5, 1, 0, 6, 8, 1, 5, 8, 6, 9, 7, 8, 6, 3, 6, 8, 2, 6, 0, 4, 2, 7, 2, 6, 3, 4, 7, 9, 1, 4, 5, 4, 7, 3, 0, 4, 1, 7, 0, 9, 0, 5, 3, 9, 1, 6, 5, 8, 1, 8, 9, 2, 1, 6, 6, 8, 3, 6, 2, 1, 5, 6, 6, 6, 3, 2, 7, 5, 6, 8, 6, 6, 7, 3, 4, 4, 8, 6, 2, 6, 6, 5, 3, 1, 0, 2, 7, 4, 6, 6, 9, 3, 7, 9, 4, 5, 0, 6, 6, 1, 2, 4, 1, 0, 9, 8, 6, 7, 7, 5, 1, 7, 8, 0, 2, 6, 4, 4, 9, 6, 4, 3, 9, 4, 7, 1, 0, 0, 7, 1, 2, 1, 0, 5, 7, 9, 8, 5, 7, 5, 7, 8, 8, 4, 0, 2, 8, 4, 8, 4, 2, 3, 1, 9, 4, 3, 0, 3, 1, 5, 3, 6, 1, 1, 3, 9, 3, 6, 9, 2, 7, 7, 7, 2, 1, 2, 6, 1, 4, 4, 4, 5, 5, 7, 4, 7, 7, 1, 1, 0, 8, 8, 5, 0, 4, 5, 7, 7, 8, 2, 2, 9, 9, 0, 8, 4, 4, 3, 5, 4, 0, 1, 8, 3, 1, 1, 2, 9, 1, 9, 6, 3, 3, 7, 7, 4, 1, 6, 0, 7, 3, 2, 4, 5, 1, 6, 7, 8, 5, 3, 5, 0, 9, 6, 6, 4, 2, 9, 2, 9, 8, 0, 6, 7, 1, 4, 1, 4, 0, 3, 8, 6, 5, 7, 1, 7, 1, 9, 2, 2, 6, 8, 5, 6, 5, 6, 1, 5, 4, 6, 2, 8, 6, 8, 7, 6, 9, 0, 7, 4, 2, 6, 2, 4, 6, 1, 8, 5, 1, 4, 7, 5, 0, 7, 6, 2, 9, 7, 0, 4, 9, 8, 4, 7, 4, 0, 5, 9, 0, 0, 3, 0, 5, 1, 8, 8, 1, 9, 9, 3, 8, 9, 6, 2, 3, 6, 0, 1, 2, 2, 0, 7, 5, 2, 7, 9, 7, 5, 5, 8, 4, 9, 4, 4, 0, 4, 8, 8, 3, 0, 1, 1, 1, 9, 0, 2, 3, 3, 9, 7, 7, 6, 1, 9, 5, 3, 2, 0, 4, 4, 7, 6, 0, 9, 3, 5, 9, 1, 0, 4, 7, 8, 1, 2, 8, 1, 7, 9, 0, 4, 3, 7, 4, 3, 6, 4, 1, 9, 1, 2, 5, 1, 2, 7, 1, 6, 1, 7, 4, 9, 7, 4, 5, 6, 7, 6, 5, 0, 0, 5, 0, 8, 6, 4, 6, 9, 9, 8, 9, 8, 2, 7, 0, 6, 0, 0, 2, 0, 3, 4, 5, 8, 7, 9, 9, 5, 9, 3, 0, 8, 2, 4, 0, 0, 8, 1, 3, 8, 3, 5, 1, 9, 8, 3, 7, 2, 3, 2, 9, 6, 0, 3, 2, 5, 5, 3, 4, 0, 7, 9, 3, 4, 8, 9, 3, 1, 8, 4, 1, 3, 0, 2, 1, 3, 6, 3, 1, 7, 3, 9, 5, 7, 2, 7, 3, 6, 5, 2, 0, 8, 5, 4, 5, 2, 6, 9, 5, 8, 2, 9, 0, 9, 4, 6, 0, 8, 3, 4, 1, 8, 1, 0, 7, 8, 3, 3, 1, 6, 3, 7, 8, 4, 3, 3, 3, 6, 7, 2, 4, 3, 1, 3, 3, 2, 6, 5, 5, 1, 3, 7, 3, 3, 4, 6, 8, 9, 7, 2, 5, 3, 3, 0, 6, 2, 0, 5, 4, 9, 3, 3, 8, 7, 5, 8, 9, 0, 1, 3, 2, 2, 4, 8, 2, 1, 9, 7, 3, 5, 5, 0, 3, 5, 6, 0, 5, 2, 8, 9, 9, 2, 8, 7, 8, 9, 4, 2, 0, 1, 4, 2, 4, 2, 1, 1, 5, 9, 7, 1, 5, 1, 5, 7, 6, 8, 0, 5, 6, 9, 6, 8, 4, 6, 3, 8, 8, 6, 0, 6, 3, 0, 7, 2, 2, 2, 7, 8, 7, 3, 8, 5, 5, 5, 4, 4, 2, 5, 2, 2, 8, 8, 9, 1, 1, 4, 9, 5, 4, 2, 2, 1, 7, 7, 0, 0, 9, 1, 5, 5, 6, 4, 5, 9, 8, 1, 6, 8, 8, 7, 0, 8, 0, 3, 6, 6, 2, 2, 5, 8, 3, 9, 2, 6, 7, 5, 4, 8, 3, 2, 1, 4, 6, 4, 9, 0, 3, 3, 5, 7, 0, 7, 0, 1, 9, 3, 2, 8, 5, 8, 5, 9, 6, 1, 3, 4, 2, 8, 2, 8, 0, 7, 7, 3, 1, 4, 3, 4, 3, 8, 4, 5, 3, 7, 1, 3, 1, 2, 3, 0, 9, 2, 5, 7, 3, 7, 5, 3, 8, 1, 4, 8, 5, 2, 4, 9, 2, 3, 7, 0, 2, 9, 5, 0, 1, 5, 2, 5, 9, 4, 0, 9, 9, 6, 9, 4, 8, 1, 1, 8, 0, 0, 6, 1, 0, 3, 7, 6, 3, 9, 8, 7, 7, 9, 2, 4, 7, 2, 0, 2, 4, 4, 1, 5, 0, 5, 5, 9, 5, 1, 1, 6, 9, 8, 8, 8, 0, 9, 7, 6, 6, 0, 2, 2, 3, 8, 0, 4, 6, 7, 9, 5, 5, 2, 3, 9, 0, 6, 4, 0, 8, 9, 5, 2, 1, 8, 7, 1, 8, 2, 0, 9, 5, 6, 2, 5, 6, 3, 5, 8, 0, 8, 7, 4, 8, 7, 2, 8, 3, 8, 2, 5, 0, 2, 5, 4, 3, 2, 3, 4, 9, 9, 4, 9, 1, 3, 5, 3, 0, 0, 1, 0, 1, 7, 2, 9, 3, 9, 9, 7, 9, 6, 5, 4]
时间:0:04:24.205000
太慢了。都。。。
看下别人是怎么实现 的吧
import math,datetime
# print key,
start_time=datetime.datetime.now()
maxlen,maxn=0,0
for n in xrange(2,1001):
rest,r0=1,0
for i in xrange(0,n):#不明白这里为什么要一个循环求余一次
rest=(rest*10)%n
r0=rest
len=0
while 1:
rest,len=(rest*10)%n,len+1
if rest==r0:
break
if len>maxlen:
maxlen,maxn=len,n
print maxlen,maxn
end_time=datetime.datetime.now()
#print abundantlist
print end_time-start_time
结果:982 983
0:00:00.184000