[算法] 数字变换:举一反三之数字反转

首先是一个非常简单的题目,如何将一个数字反过来,比如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
原文地址:https://www.cnblogs.com/ZisZ/p/3334667.html