python3中多项式创建_Python3 欧拉计划 问题26-30

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螺旋数阵如下所示:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值