首先是一个非常简单的题目,如何将一个数字反过来,比如12345反转成54321;
可以选择将数字转换成字符串然后进行首尾换位操作,但更经典的作法应该是依次从原数字尾部取数,加到结果的高位;
深入思考一下,如何将数字按二进制表示进行反转呢,比如6变成3(110变成011)?如何以两位为单位进行反转呢,比如12345变成45231?
事实上,经典的数字反转算法中可以抽出两个概念,一个是这个数字的进制,另一个是进行反转时要求以多少位为一个整体;
抽出这些之后,整个算法不需要改变:
# -*- coding: utf-8 -*- import sys # 以多少位为一个整体 N = 1 # 进制 factor = 2 # 计算变换过程中的进位量 divisor = factor ** N # 读入原始数字 num = int(sys.stdin.readline().strip()) ret = 0 raw = num # 消耗原数字 while raw > 0: # 满足整个分块的部分 if (raw >= divisor): ret = ret * divisor + raw % divisor raw = raw / divisor else: # 不满足整个分块,先取位数 n = 0 tmp = raw while tmp > 0: n += 1 tmp /= factor # 按位数计算进位 tmp_divisor = factor ** n ret = ret * tmp_divisor + raw raw -= raw print ret