原题链接:蓝桥杯算法训练VIP-回文数
解题思路:
本题的主要难度在于不同进制数的相加计算。
十进制和十六进制可以做特殊处理。
具体方案如下,代码有详细注释。
注意事项:
参考代码:
def cal_n(a,b): #n进制加法计算
global n
if n == 10:
return str(int(a)+int(b))
elif n == 16:
a = list(a)
for i in range(len(a)): #将a中的字母转换为对应的值
if 'A'<=a[i]<='F':
a[i] = str(ord(a[i])-55)
b = list(b)
for i in range(len(b)): #将b中的字母转换为对应的值
if 'A'<=b[i]<='F':
b[i] = str(ord(b[i])-55)
T = 0 #存储进位
c = '' #存储本位
for i in range(len(a)-1,-1,-1): #a和b相加,从后往前计算
temp = int(a[i])+int(b[i])
if (temp+T)%n > 9:
c = c + chr(55+(temp+T)%n)
else:
c = c + str((temp+T)%n)
T = (temp+T)//n
if T: #不要忘记如果最后进制大于0,需要加上
c = c + str(T)
return c[::-1] #逆序即为结果
else:
T = 0
c = ''
for i in range(len(a)-1,-1,-1):
temp = int(a[i])+int(b[i])
c = c + str((temp+T)%n)
T = (temp+T)//n
if T:
c = c + str(T)
return c[::-1]
def check(x): #检查是否为回文数
if x == x[::-1]:
return 1
else:
return 0
def f(n,num):
step = 0
while True:
if check(num):
print('STEP={}'.format(step))
break
else:
num_ = num[::-1]
num = cal_n(num,num_)
step = step+1
if step > 30:
print('Impossible!')
break
if __name__ == '__main__':
n = int(input())
num = input().strip()
f(n,num)0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复