问题 26—30 参见: https://www.jianshu.com/p/756fa99c2b03
英国的货币单位包括英镑 £ 和便士 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 有多少种不同的方式。
- #动态规划思想,关于动态规划可参见: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
如果一个 n 位数包含了 1 至 n 的所有数字恰好一次,我们称它为全数字的;例如,五位数 15234 就是 1 至 5 全数字的。7254 是一个特殊的乘积,因为在等式 39 × 186 = 7254 中,被乘数、乘数和乘积恰好是 1 至 9 全数字的。找出所有被乘数、乘数和乘积恰好是 1 至 9 全数字的乘法等式,并求出这些等式中乘积的和。
注意:有些乘积可能从多个乘法等式中得到,但在求和的时候只计算一次。
- 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
49/98 是一个有趣的分数,因为缺乏数学知识的人可能会误认为,等式 49/98 = 4/8 之所以成立,是因为在分数线上下同时抹除了 9 的缘故。如果按照这么理解,则存在诸如 30/50 = 3/5 这样的平凡解。这类有趣的分数恰好有四个非平凡的例子,它们的分数值小于 1,且分子和分母都是两位数。将这四个分数的乘积写成最简分数,求此时分母的值。
- 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
145 是个有趣的数,因为 1! + 4! + 5! = 1 + 24 + 120 = 145。
找出所有各位数字的阶乘和等于其本身的数,并求它们的和。注意:1! = 1 和 2! = 2,由于不是和的形式,所以它们并不在讨论范围内。
- 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
197 被称为循环素数,因为将它逐位旋转所得到的数:197、971 和 719 都是素数。
小于 100 的圆周素数有十三个:2、3、5、7、11、13、17、31、37、71、73、79 和 97。小于一百万的圆周素数有多少个。
- 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
来源: http://www.jianshu.com/p/199a1762f3a0