首先是一个非常简单的题目,如何将一个数字反过来,比如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