问题26—30参见: https://www.jianshu.com/p/756fa99c2b03
31、硬币组合
英国的货币单位包括英镑£和便士p,在流通中的硬币一共有八种:
1p, 2p, 5p, 10p, 20p, 50p, £1 (100p), £2 (200p)
以下是组成£2的其中一种方式:
1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p
不限定使用的硬币数目,组成£2有多少种不同的方式。
Python3解答
#动态规划思想,关于动态规划可参见:https://www.jianshu.com/p/e515efee2310
an=[1]+[0]*200
fan=[1,2,5,10,20,50,100,200]
for i in fan:
for j in range(i,201):
an[j]+=an[j-i]
print(an[200])
答案:73682
32、全数字乘积式的和
如果一个n位数包含了1至n的所有数字恰好一次,我们称它为全数字的;例如,五位数15234就是1至5全数字的。7254是一个特殊的乘积,因为在等式39 × 186 = 7254中,被乘数、乘数和乘积恰好是1至9全数字的。
找出所有被乘数、乘数和乘积恰好是1至9全数字的乘法等式,并求出这些等式中乘积的和 [注意:有些乘积可能从多个乘法等式中得到,但在求和的时候只计算一次]。
Python3解答
def anfan(n1,n2):#判断是否是全数字的
a=list(str(n1))+list(str(n2))+list(str(n1*n2))
hu=list(range(1,10))
b=[]
for i in hu:
b.append(str(i))
if b==sorted(a):
return True
def fanan(n1):#判断数是否含有重复数字
if len(list(str(n1)))==len(set(list(str(n1)))):
return True
ana=[]#存储乘积结果
fana = []#存储表达式
#因数分别在(100, 1000) 和(10,100)之间
for i in range(100,1000):
if fanan(i):
for j in range(10,100):
if fanan(j):
if anfan(i,j):
ana.append(i*j)
fana.append('%d*%d=%d'%(i,j,i*j))
elif len(list(str(i*j)))>=5:#乘积只有小于5位数才可能为全数字的
break
#因数分别在(2, 10) 和(1000,5000)之间
for i in range(2,10):
if fanan(i):
for j in range(1000,5000):
if fanan(j):
if anfan(i,j):
ana.append(i*j)
fana.append('%d*%d=%d'%(i,j,i*j))
elif len(list(str(i*j)))>=5:#乘积只有小于5位数才可能为全数字的
break
print(fana)
print(sum(g for g in set(ana)))
答案:['138*42=5796', '157*28=4396', '159*48=7632', '186*39=7254', '198*27=5346', '297*18=5346', '483*12=5796', '4*1738=6952', '4*1963=7852']
全数字乘积式之和[重复的只计算一次]:45228
33、分数化简
49/98是一个有趣的分数,因为缺乏数学知识的人可能会误认为,等式49/98 = 4/8之所以成立,是因为在分数线上下同时抹除了9的缘故。如果按照这么理解,则存在诸如30/50 = 3/5这样的平凡解。
这类有趣的分数恰好有四个非平凡的例子,它们的分数值小于1,且分子和分母都是两位数。将这四个分数的乘积写成最简分数,求此时分母的值。
Python3解答
def an(li1,li2):#判断去除共同数字后的剩余数字
for i in li1:
if i not in li2:
return int(i)
def fan(n1,n2):#计算n1,n2约分后n2的值
for i in range(1,n1+1):
if n1%i==0 and n2%i==0:
n1//=i
n2//=i
return n2
def anfan(n1,n2):#判断2个数是否有共同的数字
a,b=list(str(n1)),list(str(n2))
if len(a+b)==len(set(a+b))+1 and '0' not in a and '0' not in b:
return True
def fanan(n1,n2):#判断两个数去除掉共同的数字之后的商和之前商是否相等
a,b=list(str(n1)),list(str(n2))
c=a+b
a1,b1=an(c,b),an(c,a)
if n1/n2==a1/b1:
return True
fan_an,an_fan=1,1
for i in range(10,100):
for j in range(i,100):
if anfan(i,j) and fanan(i,j):
xa,xb=list(str(i)),list(str(j))
xc=xa+xb
print('%d / %d = %d / %d'%(i, j, an(xc,xb), an(xc,xa)))
fan_an*=an(xc,xa)
an_fan*=an(xc,xb)
print(fan(an_fan,fan_an))
答案:四个非平凡分数:
16 / 64 = 1 / 4
19 / 95 = 1 / 5
26 / 65 = 2 / 5
49 / 98 = 4 / 8
分数乘积约分后的分母:100
34、数字阶乘
145是个有趣的数,因为有如下关系:
1! + 4! + 5! = 1 + 24 + 120 = 145。
找出所有各位数字的阶乘和等于其本身的数,并求它们的和。[注意: 1! = 1和2! = 2,由于不是和的形式,所以它们并不在此范围内]。
Python3解答
an_dict={'0':1,'1':1,'2':2,'3':6,'4':24,'5':120,'6':720,'7':5040,'8':40320,'9':362880}
hu=0
for i in range(10,8*362880):
ji=list(str(i))
jde=0
for ff in ji:
jde+=an_dict[ff]
if jde==i:#数字阶乘的和等于数
hu+=i
print('满足条件的数有:%d'%i)
print(hu)
答案:满足条件的数有:145
满足条件的数有:40585
和为:40730
35、循环素数
197被称为循环素数,因为将它逐位旋转所得到的数:197、971和719都是素数。
小于100的循环素数有十三个:
2、3、5、7、11、13、17、31、37、71、73、79、97
小于一百万的循环素数有多少个。
Python3解答
def an_del(number):#删除具有某些特征的数
ji=list(str(number))
su,us=[0,2,4,6,8,5],[4,6,8,9]
if len(ji)==1:#不是素数
if number in us:
return True
else:
for i in ji:#以su中数字结尾的都不是素数
if int(i) in su:
return True
return False
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
else:
return True
def an_fan(number):#将一个数循环
hu=list(str(number))
huuu=[hu]
for i in range(1,len(hu)):
a=[0]*len(hu)
for h in range(len(hu)):
if i+h>=len(hu):
a[h]=hu[i+h-len(hu)]
else:
a[h]=hu[i+h]
huuu.append(a)
nu_hu=[]
for jj in range(len(huuu)):
nnu=''
for hh in range(len(huuu[0])):
nnu+=huuu[jj][hh]
nu_hu.append(int(nnu))
return nu_hu
anfan=0
for i in range(2,1000000):
if not an_del(i) and com_pri(i):
hh=0
for hg in an_fan(i):
if not com_pri(hg):
hh = 1
break
if hh==0:
anfan+=1
print(anfan)
答案:55
持续更新,欢迎讨论,敬请关注!!!