Keep Hacking :)

Life is complex, it has both real and imaginary parts.

Project Euler 01 ~ 05 的解答

什麼是Project Euler?

我引述Project Euler網站的一段話:

“Project Euler exists to encourage, challenge, and develop the skills and enjoyment of anyone with an interest in the fascinating world of mathematics.”

所以,如果你也是上面所說的人,那麼就一起加入吧!

Project Euler 01

題目 這題其實不難,用手算其實絕對可以的,但是既然是用來練習程式,那我們就來寫吧!

1
2
3
4
#!/usr/bin/env python
#-*- coding:utf-8 -*-

print(sum(x for x in xrange(1, 1000) if not (x % 3) or not (x % 5)))

程式碼也很簡單好懂,這要感謝PythonList Comprehensions,讓程式碼看起來就是很舒服好懂:)

Project Euler 02

題目 這題只要照著Fibonacci number的定義下手,就不難了,没有什麼特别的技巧。

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python
#-*- coding:utf-8 -*-

fib1, fib2 = 1, 1
sum_fibs = 0
while fib1 < 4000000:
    if not fib1 % 2: sum_fibs += fib1
    fib1, fib2 = fib2, fib1 + fib2

print(sum_fibs)

照着Fibonacci Number的定義打一下,就幾乎是程式本身了,還算簡單吧:D

Project Euler 03

題目 這題希望我們找出最大的質因數,主要的想法就是從2開始慢慢往上找質因數,找到最後一個,那它就是答案了:)

1
2
3
4
5
6
7
8
9
#!/usr/bin/env python
#-*- coding:utf-8 -*-
target = 600851475143

for div in xrange(2, target):
    while not target % div: target /= div
    if target == 1:
        print(div)
        break

Project Euler 04

題目 這題在問説用兩個三位數乘出來最大的迴文數是誰?很單純的想法就是把三位數的乘積都算出來,然後判斷它是不是迴文數。

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python
#-*- coding:utf-8 -*-

import itertools, euler

prod_set = itertools.product(xrange(100, 1000), xrange(100, 1000))
Max = 0

for a, b in prod_set:
    if euler.is_palindrome(a * b) and a * b > Max: Max = a * b

print(Max)

在這裡順道附上euler.py的内容,你會發現用Python判斷迴文數出奇的簡單:D

Project Euler 05

題目 這題要找1~20的最小公倍數,簡單的想法就是我們做一個求最大公因數的函式就好了:)

1
2
3
4
5
6
7
8
9
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from euler import gcd

ans = 2
for num in xrange(3, 21):
    ans *= num / gcd(ans, num)

print(ans)

最大公因數的演算法放在euler.py裏面:p

這次先分享五題,希望我會有耐性把我寫過的題目一題一題的打出來。

Comments