projecteuler.net 題目筆記 [6-10]

題目6:平方和與和平方的差是多少?

前十個天然數的平方和是:php

12 + 22 + ... + 102 = 385python

前十個天然數的和的平方是:算法

(1 + 2 + ... + 10)2 = 552 = 3025app

因此平方和與和的平方的差是3025 − 385 = 2640.spa

找出前一百個天然數的平方和與和平方的差。指針

# 列表的平方和
def list_tuple_sum(_list):
    return sum([i**2 for i in _list])
# 列表的和的平方
def list_sum_tuple(_list):
    return sum(_list)**2
print abs(list_tuple_sum(range(1,101)) - list_sum_tuple(range(1,101)))

-25164150code


題目7:找出第10001個質數。

前六個質數是2,3,5,7,11和13,其中第6個是13.orm

第10001個質數是多少?字符串

# 判斷某個數是否質數
def test(n):
    if n < 2:return False
    for i in range(2,n):
        if n%i==0:
            return False
    return True
i=1
res = []
while len(res)<10001:
   if test(i):
       res.append(i)
   i+=1
print res[-1]

104743get

這算法一樣不好... 

改進版:

# 改進判斷某個數是否質數,使用平方根
import math
func_sqrt = math.sqrt
def test_su2(n):
    if n<2:return False
    for i in range(2,int(func_sqrt(n))+1):
        if n%i==0:return False
    return True
i=2             # 遞增
zhisu = 0       # 質數保存變量
zhisu_point = 1       # 質數記數指針,郵2開始,這裏當1次
while zhisu_point<=10001:
    if test_su2(i):
        zhisu_point += 1
        zhisu = i
    i += 1
print zhisu




題目8:找出這個1000位數字中連續13個數字乘積的最大值。

找出如下這個1000位的整數中連續13個數字的最大乘積。(例如前五個數字的乘積是7*3*1*6*7=882)


73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

s="""73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450"""
s = ''.join(s.splitlines())
def find_max(s,n):
    """找出s字符串中,n個相鄰的最大值
    """
    res = ['',0L]
    for i in range(0,len(s)):
        if len(s[i:i+n])==n:
            tmp = reduce(lambda x,y:long(x)*y, [int(e) for e in s[i:i+n]])
            if tmp > res[1]:
                res[0],res[1] = s[i:i+n], tmp
    return res
print find_max(s,13)


題目9:找出惟一的知足a + b + c = 1000的畢達哥拉斯三元組{a, b, c}。

一個畢達哥拉斯三元組是一個包含三個天然數的集合,a<b<c,知足條件:

a2 + b2 = c2

例如:32 + 42 = 9 + 16 = 25 = 52.

已知存在而且只存在一個畢達哥拉斯三元組知足條件a + b + c = 1000。

找出該三元組中abc的乘積。

for a in range(1,1000):
    for b in range(a+1,1000):
        for c in range(b+1,1000):
            if a+b+c==1000 and test_xyz(a,b,c):
                print a,b,c,":",a*b*c

200 375 425 : 31875000


題目10:計算兩百萬如下全部質數的和。

10如下的質數的和是2 + 3 + 5 + 7 = 17.

找出兩百萬如下全部質數的和。

# 判斷某個數是否質數
def test(n):
    if n < 2:return False
    for i in range(2,n):
        if n%i==0:
            return False
    return True
# 打印小於n的全部質數
def zhisu(n):
    for i in range(2,n):
        if test(i):yield i
        continue
print sum(zhisu(2000000))

這個我是等不了運行結果了. 等其餘算法.

改進版:

# 改進判斷某個數是否質數,使用平方根
import math
func_sqrt = math.sqrt
def test_su2(n):
    if n<2:return False
    for i in range(2,int(func_sqrt(n))+1):
        if n%i==0:return False
    return True
# 打印小於n的全部質數
def zhisu(func, n):
    for i in range(2,n):
        if func(i):yield i
        continue
a= [i for i in zhisu(test_su2, 2000000)]
print sum(a)

142913828922

相關文章
相關標籤/搜索