问题 31—35 参见: https://www.jianshu.com/p/199a1762f3a0
十进制数 585 的二进制表示为 1001001001,可以看出它在这两种进制下都是回文数。找出所有小于一百万,且在十进制和二进制下均是回文数的数,并求它们的和。[注意:无论在哪种进制下,第一位数均不为 0]
- def an_fan(strr):#判断回文数
- if str(strr) == str(strr)[::-1]:
- return True
- else:
- return 0
- def an_bin(n):#转为二进制
- if n==0:
- return '0'
- list_bian=''
- while n>=1:
- if n%2==0:
- list_bian+='0'
- else:
- list_bian+='1'
- n=int(n/2)
- return list_bian[::-1]
- anfan=0
- for i in range(1,1000000):
- if an_fan(str(i)) and an_fan(an_bin(i)):
- anfan+=i
- print(anfan)
- 答案:872187
3797 有着奇特的性质,不仅它本身是一个素数,而且如果从左往右逐一截去一个数字,剩下的数仍然都是素数:3797、797、97 和 7;同样地,如果从右往左逐一截去数字,剩下的也依然都是素数:3797、379、37 和 3。只有 11 个数满足这种性质,求这些数的和。[注意:2、3、5 和 7 不被视为双向可截短素数]。
- def an_fan(number):#含有偶数字的肯定不是双向可截短素数
- ab=[0,4,6,8]
- hu=str(number)
- for i in ab:
- if str(i) in hu:
- return False
- return True
- def com_pri(number):#判断素数
- if number==2:
- return True
- elif number==1:
- return False
- else:
- for i in range(2,int(number**0.5)+1):
- if number%i==0:
- return False
- return True
- def fan_an(number):#将数左右依次截短
- hu=[]
- uh=str(number)
- if len(uh)==1:
- return [8]
- else:
- for i in range(len(uh)):
- hu.append(uh[i:])
- if uh[:i]!='':
- hu.append(uh[:i])
- return hu
- m,h,b=0,10000,-1
- number = []
- while m<11:
- b+=1
- for i in range(b*h,(b+1)*h):
- if an_fan(i) and com_pri(i):
- h2=1
- for j in fan_an(i):
- if not com_pri(int(j)):
- h2*=0
- if h2==1:
- number.append(i)
- m+=1#满足条件的数的个数
- print(number)
- print(sum(number))
- 答案:11个数分别是:[23, 37, 53, 73, 313, 317, 373, 797, 3137, 3797, 739397]。
- 和为748317
将 192 分别与 1、2、3 相乘:192 × 1 = 192、192 × 2 = 384、192 × 3 = 576。连接这些乘积,我们得到一个 1 至 9 全数字的数 192384576。我们称 192384576 为 192 和 (1,2,3) 的连接乘积数。同样地,将 9 分别与 1、2、3、4、5 相乘,得到 1 至 9 全数字的数 918273645,即是 9 和 (1,2,3,4,5) 的连接乘积数。对于 n > 1,所有某个整数和 (1,2, … ,n) 的连接乘积所构成的数中,最大的 1 至 9 全数字的数是。
- def an_fan(lisa):#判断数是否为全数字的数
- for i in lisa:
- if lisa.count(i)>1 or '0' in lisa:
- return False
- return True
- anfan=0
- for i in range(1,9999):
- fanan=str(i)#乘积从1开始
- j=2
- while True:
- fanan+=str(i*j)
- j+=1
- if len(fanan)>9:#只有长度正好为9才可能满足条件
- break
- elif len(fanan)<9:
- pass
- else:
- if an_fan(fanan):
- if anfan<int(fanan):#选择最大的
- anfan=int(fanan)
- print(anfan)
- 答案:932718654
若三边长 {a,b,c} 均为整数的直角三角形周长为 p,当 p = 120 时,恰好存在三个不同的解:{20,48,52}, {24,45,51}, {30,40,50}。在所有的 p ≤ 1000 中,p 取何值时有解的数目最多。
- anfan, exdict = [], {}
- for i in range(1,int(1000/3)+1):#最短边
- for j in range(i,int(1000/2)):#中间边
- leng = (i**2+j**2)**0.5
- if leng % 1==0:
- sum = i+j+leng
- if sum <= 1000:
- anfan.append(int(sum))
- try:
- exdict[int(sum)].append([i, j, leng])
- except KeyError:
- exdict[int(sum)] = [[i, j, leng]]
- an,fan=0,0
- for i in anfan:
- af=anfan.count(i)
- if an<=af:#选择出现最多的数值
- an=af
- fan=i
- print(fan)
- print(exdict[fan])
- 答案:840。 有8个解,分别是:
- [40, 399, 401.0], [56, 390, 394.0], [105, 360, 375.0], [120, 350, 370.0], [140, 336, 364.0], [168, 315, 357.0], [210, 280, 350.0], [240, 252, 348.0]
将所有正整数连接起来构造一个十进制无理数如下所示:
0.123456789101112131415161718192021…。可以看出小数点后第 12 位数字是 1。如果 dn 表示上述无理数小数点后的第 n 位数字,求下式的值
d1 × d10 × d100 × d1000 × d10000 × d100000 × d1000000
- allstr = ''
- start = 1
- cd = {}
- while len(allstr) < 10 ** 6 + 1:
- allstr += str(start)
- start += 1
- pro = 1
- for ii in range(0, 7):
- number = int(int(allstr[10 ** ii - 1]))
- pro *= number
- cd[int(10 ** ii)] = number
- print(pro)
- print(cd)
- 答案:分别对应的数字为:{'d100000': 2, 'd100': 5, 'd1000000': 1, 'd10000': 7, 'd1': 1, 'd10': 1, 'd1000': 3}
- 乘积为:210。
来源: http://www.jianshu.com/p/e455bf4ccfc9