欧拉计划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)


相关文章
|
机器学习/深度学习 算法
【Leetcode】面试题 16.05. 阶乘尾数、HJ7 取近似值
目录 面试题 16.05. 阶乘尾数 HJ7 取近似值
80 0
|
算法 搜索推荐 程序员
欧几里得算法
欧几里得算法(Euclidean algorithm)是一种计算两个数的最大公约数(Greatest Common Divisor,简称 GCD)的算法。欧几里得算法的基本思想是通过辗转相除的方式,将两个数逐步缩小,直到它们的公约数为止。欧几里得算法的时间复杂度为 O(log n)。
255 1
|
算法 C语言 C++
【数论】最大公约数、约数的个数与约数之和定理
先来科普下什么是约数:当a能被b整除,我们就说b为a的约数,b的倍数为a
146 0
求解最大公约数和最小公倍数
求解最大公约数和最小公倍数
求解最大公约数和最小公倍数
AcWing 605. 简单乘积
AcWing 605. 简单乘积
66 0
AcWing 605. 简单乘积
每日一题1021:迭代法求平方根
题目描述: 用迭代法求 平方根 公式:求a的平方根的迭代公式为: X[n+1]=(X[n]+a/X[n])/2 要求前后两次求出的差的绝对值少于0.00001。 输出保留3位小数
174 0
|
算法
【欧拉计划第 10 题】 质数之和 Summation of primes
【欧拉计划第 10 题】 质数之和 Summation of primes
128 0
|
算法 BI
约瑟夫问题(Josephus problem)的klog(n)解法
约瑟夫问题是一个经典的算法问题,其解决过程涉可能用到的数据结构有数组、链表,涉及的算法包括模拟、递归、递推、动态规划等等,因此非常适合做一道面试题。   问题描述: 首先n个候选人围成一个圈,依次编号为0..n-1。然后指定一个正整数k,并0号候选人开始按从1到k的顺序依次报数,n-1号候选人报数之后,又再次从0开始。当有人报到K时,这个人被淘汰,从圈里出去。下一个人从1开始重新报
4410 0