Python3 欧拉计划 问题26-30

Python3 欧拉计划 问题26-30_第1张图片
EulerProject.png

问题21—25参见: http://www.jianshu.com/p/5437d1305800

26、最长的倒数循环节

  单位分数是指分子为1的分数。分母从2到10的单位分数的十进制表示如下所示:
    1/2= 0.5
    1/3= 0.(3)
    1/4= 0.25
    1/5= 0.2
    1/6= 0.1(6)
    1/7= 0.(142857)
    1/8= 0.125
    1/9= 0.(1)
    1/10= 0.1
这里0.1(6)表示0.166666…,括号内表示有一位的循环节。可知,1/7有六位循环节。
  找出小于1000的正整数d,其倒数的十进制表示的小数部分有最长的循环节。

Python3解答
import re
from decimal import *
getcontext().prec,an_fan=1000*5 ,0
def an_match(number):
    fan_form=r"(\d+?)\1" #正则表达式匹配重复的数字
    an=re.search(fan_form, str(number))
    if an:
        return an.group(1)
def fan_num(aa):
    if len(str(int(aa)))>=1:
        return 10**(len(str(aa))-1)
    else:
        return 1

for i in range(1,1000):
    fan=[an_match(Decimal(1)*fan_num(i)/Decimal(i))]# 防止匹配的数字为0,因此分子要相应的扩大倍数,保证小数点后第一个数字不为0
    if fan!=[None]:#只有无限不循环的小数才进行判断
        if len(fan[0]) >= an_fan:# 选取最长的
            an_fan = len(fan[0])
            dnumber = i
print(dnumber)
答案:983

27、二次“素数生成”多项式

  欧拉发现了这个著名的二次多项式:n2 + n + 41。n从0到39,这个二次多项式生成了40个素数。然而,当n = 40时,402 + 40 + 41 = 40(40 + 1) + 41能够被41整除,同时显然当n = 41时,412 + 41 + 41也能被41整除。
  随后,另一个神奇的多项式n2 − 79n + 1601被发现了,对于n从0到79,它生成了80个素数。这个多项式的系数-79和1601的乘积为-126479。
  考虑以下形式的二次多项式:n2 + an + b, 满足|a| < 1000且|b| < 1000。其中|n|表示n的绝对值,例如|11| = 11以及|−4| = 4。这其中存在某个二次多项式能够对从0开始尽可能多的连续整数n都生成素数,求其系数a和b的乘积。

Python3解答
def com_pri(number):#判断素数
    if  number==2:
        return True
    else:
        for i in range(2,int(number**0.5)+1):
            if number%i==0:
                return False
        return True
fan_an=[x for x in range(2,1001) if com_pri(x)]#n =0 时, b为素数
def an_fan(i,j,n, c=0):
    if com_pri(abs(n**2+i*n+j)):
         c+=1
         return an_fan(i,j,n+1,c)
    else:
         return c
number=0
for j in fan_an:
    for i in [x-j-1 for x in fan_an]:#n= 1 时, a+b+1 为素数
        result=an_fan(i,j,0,c=0)
        if number <= result:
            number = result
            ab = [j, i]
print(ab)
print(ab[0]*ab[1])
答案:-59231

28、螺旋数阵对角线

  从1开始,按顺时针顺序向右铺开的5 × 5螺旋数阵如下所示:


Python3 欧拉计划 问题26-30_第2张图片
problem28.png

可以验证,该数阵对角线上的数[红色数字]之和是101。
  以同样方式构成的1001 × 1001螺旋数阵对角线上的数之和是。

Python3解答
anfan=sum((j**2+j**2-3*(j-1))*2 for j in range(3,1002) if j%2==1)+1
print(anfan)
答案:669171001

29、不同的幂

  考虑所有满足2 ≤ a ≤ 5和2 ≤ b ≤ 5的整数组合生成的幂a^b
    2^2=4, 2^3=8, 2^4=16, 2^5=32
    3^2=9, 3^3=27, 3^4=81, 3^5=243
    4^2=16, 4^3=64, 4^4=256, 4^5=1024
    5^2=25, 5^3=125, 5^4=625, 5^5=3125
如果把这些幂按照大小排列并去重,我们得到以下由15个不同的项组成的序列:
4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125
  在所有满足2 ≤ a ≤ 100和2 ≤ b ≤ 100的整数生成的幂a^b排列并去重所得到的序列中,有多少项。

Python3解答
an=[]
fan=0
for i in range(2,101):
    for j in range(2,101):
        if i**j not in an:
            fan+=1
            an.append(i**j)
print(fan)
答案:9183

30、数字的五次幂

  令人惊讶的是,只有三个数可以写成它们各位数字的四次幂之和:
    1634 = 1^4 + 6^4 + 3^4 + 4^4
    8208 = 8^4 + 2^4 + 0^4 + 8^4
    9474 = 9^4 + 4^4 + 7^4 + 4^4
由于1 = 1^4不是一个和的形式,因此这里没列出。这些数的和是1634 + 8208 + 9474 = 19316。
  找出所有可以写成它们各位数字的五次幂之和的数,并求这些数的和。

Python3解答
def an_fan(number):
    an_fan=[]
    for i in range(len(str(number))):
        an_fan.append(str(number)[i])
    if sum(int(i)**5 for i in an_fan)==number:
        return True
fanlist = [i for i in range(2,9**6) if an_fan(i)]
print(fanlist)
print(sum(fanlist))
答案:[4150, 4151, 54748, 92727, 93084, 194979],和为443839

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

你可能感兴趣的:(Python3 欧拉计划 问题26-30)