Python3 欧拉计划 问题6-10

96
AiFan
2017.11.14 15:38* 字数 414

EulerProject.png

问题1-5参见 http://www.jianshu.com/p/f333469fe784

6、平方的和与和的平方之差

  前10个自然数平方的和是:1^2 + 2^2 +… + 10^2 = 385。前10个自然数和的平方是:(1 + 2 + … + 10)^2 = 55^2=3025。因此前10个自然数的平方的和与和的平方之差是 3025−385=2640。求前100个自然数平方的和与和的平方之差。

Python3解答
an=sum(i**2 for i in range(1,101))
fan=sum(i for i in range(1,101))**2
print(fan-an)
答案:25164150

7、第10001个素数

  如果要依次列出前6个素数的话,它们是:2、3、5、7、11和13。可以看出,第6个素数是13。求第10001个素数。

Python3解答
def an_prime(number):
    if number==1 or number==0:
        return False
    for i in range(2,int(number**0.5)+1):
        if number%i==0 and number>i:
            return False
    return True
d,count=0,0
while 1:
    if an_prime(d):
        count+=1
        if count==10001:
            break
    d+=1
print(d) 
答案:104743

问题8、连续数字最大乘积

  在下面的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个数字,求它们的乘积。

Python3解答
#将以上数据复制到txt文件:secries.txt
an=[]#存储数据
for line in open(r'C:\Users\GWT9\Desktop\ss.txt'):#读取数据
    for i in line:
        for j in i:
            if j!='\n':
                an.append(int(j))
zuida=13        
fan={}#存储连续13个数字的乘积
for i in range(0,len(an)+1-zuida):
    ss=1
    for j in an[i:i+zuida]:
        ss*=j
    fan[i]=ss
#选择字典中值最大的对应的键值
maxkey=max(fan.items(),key=lambda x:x[1])
print(an[maxkey[0]:maxkey[0]+zuida])#[5, 5, 7, 6, 6, 8, 9, 6, 6, 4, 8, 9, 5]
print(maxkey)
答案:23514624000

9、特殊的毕达哥拉斯三元组

  毕达哥拉斯三元组是三个自然数a < b < c组成的集合,并满足a^2+ b^2 = c^2。 例如3^2 + 4^2 = 9 + 16 = 25 = 5^2。有且只有一个毕达哥拉斯三元组满足 a + b + c = 1000。求这个三元组的乘积abc。

Python3解答
for i in range(1,300):#abc最小值肯定低于300
    for j in range(1,500):#abc中间值肯定低于500
        if i**2+j**2==(1000-i-j)**2:
            print(i,j,1000-i-j)#200 375 425
            print(i*j*(1000-i-j))
答案:31875000

10、素数之和

  所有小于10的素数的和为2 + 3 + 5 + 7 = 17。求小于两百万的所有素数之和。

Python3解答
#一般方法:全部数字都遍历 用时:23.517s
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
anfan=0
for i in range(2,2000000):#全部遍历
    if an_prime(i):
        anfan+=i
print(anfan)

#优化方法:数字筛选 用时:0.124s
def primes(n):
    an=[True]*n
    for i in range(3,int(n**0.5)+1,2):#消去合数
        if an[i]:
            an[i*i::2*i]=[False]*int((n-i*i-1)/(2*i)+1)
    primelist=[2]+[j for j in range(3,n,2) if an[j]]
    return sum(primelist)
print(primes(2000000))
答案:142913828922

持续更新,欢迎讨论,敬请关注!!!

欧拉计划
Gupao