题目描述
6 ×9=42 对于十进制来说是错误的,但是对于 13 进制来说是正确的。即 6(13) ×9(13)=42(13),而 42(13)=4 ×13^1+2 ×13^0=54(10)。
你的任务是写一段程序读入三个整数 p,q 和 r,然后确定一个进制 B(2≤B≤16) 使得 p ×q=r 。如果 B 有很多选择,则输出最小的一个。
例如:p=11,q=11,r=121,则有 11(3) ×11(3)=121(3),因为 11(3)=1 ×3^1+1 ×3^0=4(10) 和 121(3)=1 ×3^2+2 ×3^1+1 ×3^0=16(10)。对于进制 10 , 有 11(10) ×11(10)=121(10)。这种情况下,应该输出 3。如果没有合适的进制,则输出 0。
输入
一行,包含三个整数 p,q,r ,相邻两个整数之间用单个空格隔开。
输出
一个整数:即使得 p×q=r 成立的最小的 B。如果没有合适的 B,则输出 0。
样例输入1
6 9 42
样例输出1
13
提示
p,q,r 的所有位都是数字,并且 1≤p,q,r≤106 。
来源/分类(难度系数:一星)
函数与递归 进制转换
完整代码展示:
# coding=utf-8
p,q,r=map(int,input().split())
s=[]
x=list(str(r))
x.reverse()
for i in range(2,17):
y=p*q
sum=0
for j in range(0,len(x)):
sum+=eval(x[j])*i**j
if sum==y:
s.append(i)
if len(s)==0:
print(0)
else:
print(s[0])
# coding=utf-8
p,q,r=map(int,input().split())
s=[]
x=list(str(r))
x.reverse()
for i in range(2,17):
y=p*q
sum=0
for j in range(0,len(x)):
sum+=eval(x[j])*i**j
if sum==y:
s.append(i)
if len(s)==0:
print(0)
else:
print(s[0])
代码解释:
“p,q,r=map(int,input().split()) ”,导入用户的三个整数p,q,r。
“s=[]
x=list(str(r))
x.reverse() ”,建立一个空列表s,用于储存可能存在的进制数。接着将x转换为字符串储存在列表x中,再将x反转。
“for i in range(2,17):
y=p*q
sum=0
for j in range(0,len(x)):
sum+=eval(x[j])*i**j
if sum==y:
s.append(i) ”,遍历2~16的数字i,查找是否存在符合的进制数p,q之积p*q等于该数字的进制数r。如果有:则将i添加进s中。
“if len(s)==0:
print(0)
else:
print(s[0]) ",遍历结束后,判断s是否为空:如果为空,打印0,否则打印s[0]。
运行效果展示:
拓展延伸:
除bin(),hex(),oct()等内置进制转换函数外,可通过自定义函数进行进制转换。