No_26:Reciprocal cycles

本文探讨了单位分数中循环节最长的问题,通过两种不同的算法实现,寻找分母小于1000时,其倒数拥有最长循环节的整数。对比了两种方法的效率,并给出了详细的运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with denominators 2 to 10 are given:

1/20.5
1/30.(3)
1/40.25
1/50.2
1/60.1(6)
1/70.(142857)
1/80.125
1/90.(1)
1/100.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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值