projecteuler.net 题目笔记 [6-10]

题目6:平方和与和平方的差是多少?

前十个自然数的平方和是:

12 + 22 + ... + 102 = 385

前十个自然数的和的平方是:

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

所以平方和与和的平方的差是3025 − 385 = 2640.

找出前一百个自然数的平方和与和平方的差。

# 列表的平方和
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)))

-25164150


题目7:找出第10001个质数。

前六个质数是2,3,5,7,11和13,其中第6个是13.

第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]

104743

这算法同样很差... 

改进版:

# 改进判断某个数是否质数,使用平方根
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

你可能感兴趣的:(projecteuler.net 题目笔记 [6-10])