欧拉计划Problem 5 最小公倍数

简介: 欧拉计划Problem 5 最小公倍数

题目


Smallest multiple

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?


最小公倍数


2520是最小的能够被1到10整除的数。


最小的能够被1到20整除的正数是多少?


解法一


暴力循环解题

依次加1,

用这个方法解决1-10还是可以的,解决1-20就太浪费时间了,至少要跑10分钟

n = 20
sn = n
while True:
    for i in range(1,n+1):
        if sn%i == 0:
            pass
        else:
            sn+=1
            break
    else:
        break
    if sn%10000==0:
        print(sn)
print(sn)

解法二


利用质数求解


其实题目就是想让求1-20 的最小公倍数,


而质数的公倍数就是质数相乘

例:2,3,5的公倍数 就是2 * 3 * 5 = 30

我们可以利用这个性质先求出来所有质数的公倍数 skip 、

又因为最后的结果,也要是质数的倍数,所以,结果也是skip的倍数

我们以skip为步长,依次判断


经过最后的测试,时间仅需要:0.000997304916381836

n = 20     # 1-n
skip = 1
for i in range(1,n+1):   # 求里面的质数的乘积,因为质数互质,
    if fs(i):
        skip *= i     # 最后求出的数一定是skip的倍数,只有是skip的倍数,才能满足所有的质数为它的因子
bei = 1
while True:
    skip2 = bei*skip      # 求倍数
    for i in range(1,n+1):
        if skip2%i!=0:   # 如果不满足1-n为它的因数,就增加一倍
            bei+=1
            break
    else:   # for else 结构自己在看看,当1-n所有的数都是 skip2 的因数,跳出while循环
        break
print(skip2)


相关文章
|
算法
HDU-1217,Arbitrage(Floyd加法变乘法)
HDU-1217,Arbitrage(Floyd加法变乘法)
|
Java
HDOJ/HDU 5686 Problem B(斐波拉契+大数~)
HDOJ/HDU 5686 Problem B(斐波拉契+大数~)
102 0
HDOJ(HDU) 2504 又见GCD(利用最大公约数反推)
HDOJ(HDU) 2504 又见GCD(利用最大公约数反推)
106 0
|
Java
HDOJ/HDU 1250 Hat's Fibonacci(大数~斐波拉契)
HDOJ/HDU 1250 Hat's Fibonacci(大数~斐波拉契)
99 0
|
机器学习/深度学习
HDOJ 1013题Digital Roots 大数,9余数定理
HDOJ 1013题Digital Roots 大数,9余数定理
137 0
|
人工智能 BI 机器学习/深度学习
[LeetCode] Fraction Addition and Subtraction 分数加减法
Given a string representing an expression of fraction addition and subtraction, you need to return the calculation result in string format.
1301 0