问题36—40参见:https://www.jianshu.com/p/e455bf4ccfc9
41、全数字的素数
如果一个n位数恰好使用了1至n每个数字各一次,我们就称其为全数字的。例如,2143就是一个4位全数字数,同时它恰好也是一个素数。
最大的全数字的素数是多少。
Python3解答
#这个数字不可能是8、9位数。因为可以被3整除。
def an_pri(number):#判断素数
if number==2:
return True
elif number>2:
for i in range(2,int(number**0.5)+1):
if number%i==0:
return False
return True
elif number==1:
return False
def an_lastdi(number):#根据尾数筛选素数
hu,hh=[2,4,6,8,5],list(str(number))
if int(hh[-1]) in hu:
return False
return True
def an_len(number):#根据数字长度筛选素数
uh=len(str(number))
if uh==9 or uh==6 or uh==3:
return False
return True
def an_once(number):#判断全数字的
hu=list(str(number))
uh,an_hu=list(range(1,len(hu)+1)),[]
for j in hu:
an_hu.append(int(j))
if sorted(an_hu)==uh:
return True
for i in range(7654321,1,-1):
if an_len(i) and an_lastdi(i) and an_once(i):
if an_pri(i):
print(i)
break
答案:7652413
42、三角形单词
三角形数序列的第n项tn可由公式n(n+1)/2得到;因此前十个三角形数是:
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, …
将一个单词中的每个字母分别转化为其在字母表中的顺序并相加,我们可以计算出一个单词的值。例如,单词SKY的值就是 19 + 11 + 25 = 55 = t10。如果一个单词的值是一个三角形数,我们就称这个单词为三角形单词。
在文件words.txt 中包含有将近两千个常用英文单词,这其中有多少个三角形单词。
Python3解答
#读取文件
with open(r'C:\Users\GWT9\Desktop\p042_words.txt')as an_file:
fan=an_file.read()
fan_an=fan.replace('"','').split(',')
#判断是否为三角形数
def an_trin(number):
sboot = int((2*number)**0.5)
if 2*number==sboot*(sboot+1):
return True
#计算单词中字母对应的顺序之和
def an_ord(str1):
return sum(ord(i)-64 for i in str1)
fan=0
for h in fan_an:
if an_trin(an_ord(h)):
fan+=1
print(fan)
答案:162
43、子串可整除
1406357289是一个0至9的全数字数,因为它由0到9这十个数字排列而成;但除此之外,它还有一个有趣的性质:子串可整除
记d1是它的第一个数字,d2是第二个数字,依此类推,我们注意到:
d2d3d4=406能被2整除
d3d4d5=063能被3整除
d4d5d6=635能被5整除
d5d6d7=357能被7整除
d6d7d8=572能被11整除
d7d8d9=728能被13整除
d8d9d10=289能被17整除
找出所有满足同样性质的0至9全数字数,并求它们的和。
Python3解答
from itertools import permutations as ip#引入组合库
hh=[''.join(list(i)) for i in list(ip('1023456789'))]
alldigit = []
for i in hh:
if i[0]!='0':
if int(i[7:10])%17==0:
if int(i[6:9])%13==0:
if int(i[5:8])%11==0:
if int(i[4:7])%7==0:
if i[5] in ['0','5']:
if int(i[2:5])%3==0:
if int(i[3])%2==0:
alldigit.append(int(i))
print(alldigit)
print(sum(alldigit))
答案:满足此条件的数:[1406357289, 1430952867, 1460357289, 4106357289, 4130952867, 4160357289]
所有数之和:16695334890
44、五边形数
五边形数是由公式Pn=n(3n−1)/2生成。前10个五边形数是:
1, 5, 12, 22, 35, 51, 70, 92, 117, 145, …
可以看出P4 + P7 = 22 + 70 = 92 = P8。然而,它们的差70 − 22 = 48并不是五边形数。
在所有和差均为五边形数的五边形数对Pj和Pk中,找出使D = |Pk − Pj|最小的一对,此时D的值是。
Python3解答
def an_pan(number):#判断是否为五边形数
if ((24*number+1)**0.5+1)%6==0:
return True
an_set,i,af=set(),0,1
while af!=0:
i+=1
fan=int(i*(3*i-1)/2)
an_set.add(fan)
for an in an_set:
if fan-an in an_set and an_pan(an+fan):
print(fan, an, fan-an)
af=0
答案:五边形数对【7042750 ,1560090】
差为:5482660
45、三角形数、五边形数和六角形数
三角形数、五边形数和六角形数分别由以下公式给出:
三角形数 Tn=n(n+1)/2 1, 3, 6, 10, 15, …
五边形数 Pn=n(3n−1)/2 1, 5, 12, 22, 35, …
六边形数 Hn=n(2n−1) 1, 6, 15, 28, 45, …
可以验证,T285 = P165 = H143 = 40755。
找出下一个同时是三角形数、五边形数和六角形数的数。
Python3解答
def an_fan(num):
if((24*num+1)**0.5+1)%6==0:#判断五边形数
if ((8*num+1)**0.5+1)%4==0:#判断六角形数
return True
n=285
while True:
n+=1
fan=int(n*(n+1)/2)#三角形数
if an_fan(fan):
print(fan)
break
答案:1533776805
持续更新,欢迎讨论,敬请关注!!!
网友评论