大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

Python3 欧拉计划 问题1-5

欧拉计划(Project Euler)是一个解题网站,包括一系列有挑战性的数学与计算机编程题;要解开它们,需要的不止是数学知识:尽管数学能够帮助你找到一些优雅而有效的方法,大多数题目仍需要借助计算机和编程技巧来完成解答。本系列会持续按序更新对全部问题的基于Python3的解决方法。此外本文仅提供问题的中文版,英文题目请参见网站。

问题1、3和5的倍数

小于10的非零自然数中是3或者5的倍数有3、5、6、9,这四个数的和为23。计算小于1000的自然数中是3或者5的倍数的所有数的和。

Python3解答
an=sum([i for i in range(1,1000) if i%3==0 or i%5==0])
print(an)
答案:233168

问题2、斐波那契数列中的偶数

斐波那契数列中每一项均是由前两项的和组成,以1和2作为开始的两项,则前10项为1、2、3、5、8、13、21、34、59、89。请计算最后一项不超过400万的斐波那契数列中的所有偶数之和。

Python3解答
a,b=1,2
fan=2#开始的两项中的偶数
while a+b<=4000000:
    a,b=b,a+b
    if(a+b)%2==0:#只计算偶数
        fan+=a+b
print(fan)
答案:4613732

问题3、最大素因数

13195的素因数为5、17、13和29。求解60051475143的最大的素因数。

Python3解答
def an_prime(number):#判断是否为素数
    if number==1 or number==2:
        return False
    for i in range(2,int(number**0.5)+1):#一个数的最大因数不超过其平方根
        if number%i==0:
            return False
    return True
an=0
for i in range(2,int(600851475143**0.5)):
    if 600851475143%i==0 and an_prime(i):
       if an<i:
          an=i
print(an)
答案:6857

问题4、最大的乘积回文数

所谓回文数就是从后往前和从前往后读是一样的数。由两个2位数相乘得到的最大回文乘积是 9009 = 91 × 99。找出由两个3位数相乘得到的最大回文乘积数。

Python3解答
def an_palindromic(number):#判断回文数
    an=[i for i in str(number)]
    fan=0
    for i in range(len(an)):
        if an[i]==an[len(an)-1-i]:
            fan+=1
    if fan==len(an):
        return True     
an=[]   
for i in range(100,1000):
    for j in range(100,1000):
        if an_palindromic(i*j):
            an.append(i*j)
print(max(an))
答案:993*913=906609

问题5、最小倍数

能被1到10这10个数整除的最小的正数是2520。计算最小的能够被1到20整除的正数。

Python3解答
def an_prime(number):#判断是否为质数
    for i in range(2,int(number**0.5)+1):
        if number%i==0 and number>i:
            return False
    return True
def an_decompose(number):#数分解为质因数的乘积
    an=[]
    while not an_prime(number):
        for i in range(2,int(number**0.5)+1):
            if number%i==0 and an_prime(i):
                an.append(i)
                number=int(number/i)
    if number!=1:
        an.append(number)
    return an
an=[]#20以内的数分解为质因数
for i in range(2,21):
    for w in an_decompose(i):   
        an.append(w)
def an_list(list1,list2):
    for i in list2:
        while list1.count(i)<list2.count(i):
            list1.append(i)
    return list1
an=list(set(an))
fan=2
while fan<=20:#如果一个数的全部质因数包括在an里,则不增加。否则少几个加几个。
    an=an_list(an,an_decompose(fan))
    fan+=1
fan=1#计算最终的乘积
for i in an:
    fan*=i
print(fan)
答案:232792560

如有问题或者想法,欢迎大家指正讨论。