問題26—30參見:http://www.reibang.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
??不限定使用的硬幣數(shù)目报腔,組成£2有多少種不同的方式涝缝。
Python3解答
#動態(tài)規(guī)劃思想膀斋,關(guān)于動態(tài)規(guī)劃可參見:http://www.reibang.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屏积、全數(shù)字乘積式的和
??如果一個n位數(shù)包含了1至n的所有數(shù)字恰好一次,我們稱它為全數(shù)字的宾舅;例如统阿,五位數(shù)15234就是1至5全數(shù)字的。7254是一個特殊的乘積筹我,因為在等式39 × 186 = 7254中扶平,被乘數(shù)、乘數(shù)和乘積恰好是1至9全數(shù)字的蔬蕊。
??找出所有被乘數(shù)结澄、乘數(shù)和乘積恰好是1至9全數(shù)字的乘法等式,并求出這些等式中乘積的和 [注意:有些乘積可能從多個乘法等式中得到岸夯,但在求和的時候只計算一次]麻献。
Python3解答
def anfan(n1,n2):#判斷是否是全數(shù)字的
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):#判斷數(shù)是否含有重復(fù)數(shù)字
if len(list(str(n1)))==len(set(list(str(n1)))):
return True
ana=[]#存儲乘積結(jié)果
fana = []#存儲表達(dá)式
#因數(shù)分別在(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位數(shù)才可能為全數(shù)字的
break
#因數(shù)分別在(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位數(shù)才可能為全數(shù)字的
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']
全數(shù)字乘積式之和[重復(fù)的只計算一次]:45228
33赎瑰、分?jǐn)?shù)化簡
??49/98是一個有趣的分?jǐn)?shù),因為缺乏數(shù)學(xué)知識的人可能會誤認(rèn)為破镰,等式49/98 = 4/8之所以成立餐曼,是因為在分?jǐn)?shù)線上下同時抹除了9的緣故。如果按照這么理解鲜漩,則存在諸如30/50 = 3/5這樣的平凡解源譬。
??這類有趣的分?jǐn)?shù)恰好有四個非平凡的例子,它們的分?jǐn)?shù)值小于1孕似,且分子和分母都是兩位數(shù)踩娘。將這四個分?jǐn)?shù)的乘積寫成最簡分?jǐn)?shù),求此時分母的值。
Python3解答
def an(li1,li2):#判斷去除共同數(shù)字后的剩余數(shù)字
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個數(shù)是否有共同的數(shù)字
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):#判斷兩個數(shù)去除掉共同的數(shù)字之后的商和之前商是否相等
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))
答案:四個非平凡分?jǐn)?shù):
16 / 64 = 1 / 4
19 / 95 = 1 / 5
26 / 65 = 2 / 5
49 / 98 = 4 / 8
分?jǐn)?shù)乘積約分后的分母:100
34养渴、數(shù)字階乘
??145是個有趣的數(shù)雷绢,因為有如下關(guān)系:
????1! + 4! + 5! = 1 + 24 + 120 = 145。
??找出所有各位數(shù)字的階乘和等于其本身的數(shù)理卑,并求它們的和翘紊。[注意: 1! = 1和2! = 2,由于不是和的形式藐唠,所以它們并不在此范圍內(nèi)]帆疟。
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:#數(shù)字階乘的和等于數(shù)
hu+=i
print('滿足條件的數(shù)有:%d'%i)
print(hu)
答案:滿足條件的數(shù)有:145
滿足條件的數(shù)有:40585
和為:40730
35、循環(huán)素數(shù)
??197被稱為循環(huán)素數(shù)宇立,因為將它逐位旋轉(zhuǎn)所得到的數(shù):197踪宠、971和719都是素數(shù)。
小于100的循環(huán)素數(shù)有十三個:
????2妈嘹、3柳琢、5、7润脸、11柬脸、13、17津函、31肖粮、37孤页、71尔苦、73、79行施、97
??小于一百萬的循環(huán)素數(shù)有多少個允坚。
Python3解答
def an_del(number):#刪除具有某些特征的數(shù)
ji=list(str(number))
su,us=[0,2,4,6,8,5],[4,6,8,9]
if len(ji)==1:#不是素數(shù)
if number in us:
return True
else:
for i in ji:#以su中數(shù)字結(jié)尾的都不是素數(shù)
if int(i) in su:
return True
return False
def com_pri(number):#判斷素數(shù)
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):#將一個數(shù)循環(huán)
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
持續(xù)更新,歡迎討論蛾号,敬請關(guān)注3硐睢!鲜结!??