原题链接:蓝桥杯算法训练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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复