Q5

问题:

2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.

What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?

第一次思路:
对一个n求出它因子,并把它放到一个set里面。

所以1-10的话,只要求出10个set,并把合并起来。

然后set里的元素做乘积运算。。这个就是最终结果了。


很明显的,我这个是有问题的,2的因子为set({1,2}),而8的因子也为set({1,2}),那么最小公倍数为2 吗。这显示不可能。

我的第一种思路破产了。。哭

由此我认识到,不但要显示因子,还要显示因子的个数。

接下来是我的最终代码了:

import datetime
###############主程序###################
known={1:{1:1},2:{1:1,2:1}}
def uniondict (d1,d2):
    for key,value in d2.iteritems() :
         value1=d1.get(key,0)
         d1[key]=value1+value  
def allit (n):
    if n in known:
         return known[n]
    else:
         dict1=dict()
         divisor=2
         while n%divisor!=0:
              divisor+=1
         dict1[divisor]=dict1.get(divisor,0)+1
         uniondict(dict1,allit(n/divisor))
         known[n]=dict1
         return dict1
def getmultiple (m,n):
    set1=dict()
    for item in xrange(m,n+1) :
         tem_set=allit(item)
         print item,tem_set
         for key,value2 in tem_set.iteritems() :
              value1=set1.get(key,0)
              if value1==0:
                   set1[key]=value2
              else:
                   set1[key]=max(value1,value2)     
    mul_result=1
    for key,value in set1.iteritems() :
         mul_result*=key**value
    return mul_result
start=datetime.datetime.now()
print getmultiple(1,20)
end=datetime.datetime.now()
print (end-start)
。恩,结果对了,不过,代码有点小长。。。

大牛的代码:

def delbart(t,n):
    if n > 0:
        if not (t%n):
            if delbart(t, n-1):
                return True
            else:
                return False
        else:
            return False
    else:
        return True
start=datetime.datetime.now()
i = 20
while not delbart(i,20):
    i +=20
print i
end=datetime.datetime.now()
print (end-start)
这个思路:
delbart表示一个只有当n<0或者t能被[1,n]的所有数整除时才表示真。
。。这个代码代码量比我的少很多,但是比我慢。。

大牛2的代码:

i = 1
for k in (range(1, 21)):
    if i % k > 0:
        for j in range(1, 21):
            if (i*j) % k == 0:
                i *= j
                break
print i

大哭,不足10行啊。。速度也很快啊。我花了快半个小时了啊。。。叫人怎么活啊。

大牛3的代码:

import datetime
###############主程序###################
def gcd(a, b):
    while b != 0:
        a, b = b, a % b
    return a
def lcm(a, b):
    return a*b/gcd(a, b)
start=datetime.datetime.now()
print reduce(lcm, range(1, 20+1))
end=datetime.datetime.now()
print (end-start)
哭,又是一个不足10行的贱人。。。 抓狂




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值