Knight000's Blog

随缘写写,不定时更新

0%

欧拉计划

欧拉计划中文翻译站:https://pe-cn.github.io/
欧拉计划原站:https://projecteuler.net/
这里引用一下网站上的介绍:

欧拉计划是一系列有挑战性的数学与计算机编程题;要解开它们,需要的不止是数学知识:尽管数学能够帮助你找到一些优雅而有效的方法,大多数题目仍需要借助计算机和编程技巧来完成解答。
创立欧拉计划的初衷,以及不断维持其运行的动力,在于为好奇的头脑提供一个平台,使他们能够在有趣愉悦的氛围中,探索未知领域,学习新的知识。

总而言之,就是一些有趣的数学与编程题目,感谢@Toyomu告诉了我这个网站。

好久没去写了…本人大概…坑了。

题目

本篇中的原题翻译均来自欧拉计划中文翻译站

解法非最佳解法,仅仅是自娱自乐(???)
提交答案之后,可以在这个页面看到别人的解法。

Problem 1 Multiples of 3 and 5

3的倍数和5的倍数
如果我们列出10以内所有3或5的倍数,我们将得到3、5、6和9,这些数的和是23。
求1000以内所有3或5的倍数的和。

直接用Python暴力…

1
2
3
4
5
s=0
for i in range(1,1000):
if i%3==0 or i%5==0:
s=s+i
print(s)

Problem 2 Even Fibonacci numbers

偶斐波那契数
斐波那契数列中的每一项都是前两项的和。由1和2开始生成的斐波那契数列前10项为:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …
考虑该斐波那契数列中不超过四百万的项,求其中为偶数的项之和。

依旧是Python暴力hh

1
2
3
4
5
6
7
8
9
10
11
s = 2
a = 1
b = 2
i = 0
while i <= 4000000:
i = a+b
a = b
b = i
if i % 2 == 0:
s = s+i
print(s)

Problem 3 Largest prime factor

最大质因数
13195的所有质因数为5、7、13和29。
600851475143最大的质因数是多少?

使用while和if语句就可以轻松实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import math
n = 600851475143
a = 2
b = 1
while n > 1:
if n % a == 0:
b = a
n = n / a
while n % a == 0:
n = n / a
a += 1
if (a > math.sqrt(600851475143)):
break
print(b)

Problem 4 Largest palindrome product

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

Python的切片十分简单,所以可以很轻易地验证是否为回文数。
通过for循环暴力…咳咳。
(特别鸣谢:@Toyomu))

1
2
3
4
5
6
7
asw = []
for a in range(999, 100, -1):
for b in range(999, 100, -1):
lst = list(str(a*b))
if lst == lst[::-1]:
asw.append(a*b)
print(max(asw))

Problem 5 Smallest multiple

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

1
2
3
4
#20以内的素数有:2,3,5,7,11,13,17,19
#然后这些素数在20以内的最高次方的数是:16,9,5,7,11,13,17,19
#把这些相乘,得到结果
print(16*9*5*7*11*13*17*19)

Problem 6 Sum square difference

平方的和与和的平方之差
前十个自然数的平方的和是
12 + 22 + … + 102 = 385
前十个自然数的和的平方是
(1 + 2 + … + 10)2 = 552 = 3025
因此前十个自然数的平方的和与和的平方之差是 3025 − 385 = 2640。
求前一百个自然数的平方的和与和的平方之差。

非常简单,直接一个循环搞定

1
2
3
4
5
6
c = 0
b = 0
for a in range(1, 101):
c = a ** 2+c
b = a+b
print(b**2 - c)

Problem 7 10001st prime

第10001个素数
列出前6个素数,它们分别是2、3、5、7、11和13。我们可以看出,第6个素数是13。
第10,001个素数是多少?

@普奇神父:“冷静下来,先数质数”
我们应该让Python很冷静的去数质数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
i = 1
a = 1
f = True
while i <= 10001:
a = a+1
for d in range(2, a, 1):
if a % d == 0:
f = False
break
if f:
i = i+1
asw = a
else:
f = True
print(asw)

Problem 8 Largest product in a series

连续数字最大乘积
在下面这个1000位正整数中,连续4个数字的最大乘积是 9 × 9 × 8 × 9 = 5832。
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450
找出这个1000位正整数中乘积最大的连续13个数字。它们的乘积是多少?

第一眼看过去….
冷静下来,想想,其实用python解决这个不太难
直接把所有数输进去再通过循环语句和判断语句来实现逐个相乘然后输出最大的乘积,其实也挺简单的。
(但是还是出了点小岔子…咳咳)

1
2
3
4
5
6
7
8
9
que = list(str(7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450))
asw = 0
for i in range(0, 988):
cache = 1
for a in range(0, 13):
cache = cache*int(que[i+a])
if asw < cache:
asw = cache
print(asw)

Problem 9 Special Pythagorean triplet

特殊毕达哥拉斯三元组
毕达哥拉斯三元组是三个自然数a < b < c组成的集合,并满足
a2 + b2 = c2
例如,32 + 42 = 9 + 16 = 25 = 52。
有且只有一个毕达哥拉斯三元组满足 a + b + c = 1000。求这个三元组的乘积abc。

当我第一眼看到的时候,想到的是两个字:暴力,于是写出了以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
for a in range(1, 1000):
b = a + 1
c = b + 1
while b <= 1000-a-c:
while c <= 1000-a-b:
if a**2+b**2 == c**2 and a+b+c == 1000:
print(a*b*c)
break
else:
c = c + 1
b = b + 1
c = b + 1

当然,答案是能算出来,不过时间嘛…
在Toyomu的启发下,优(重)化(写)了下,但还不是最佳解法就是了

1
2
3
4
5
6
for c in range(998, 1, -1):
for b in range(1, c, 1):
a = 1000-b-c
if a**2+b**2 == c**2 and a > 0:
print(a*b*c)
break

11题往后的@Toyomu的解法

请点这里,超棒的.jpg

未完待续…