zoukankan      html  css  js  c++  java
  • [算法] 数字变换:举一反三之数字反转

    首先是一个非常简单的题目,如何将一个数字反过来,比如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
    
  • 相关阅读:
    图像处理-06-图像的反色处理
    Egg.js框架
    Node基础
    Node介绍与安装
    线性表结构-数组(散列表与可变长度数组)
    复杂度分析和大O表示法
    Java框架之Struts2(六)
    Java框架之Struts2(五)
    Java框架之Struts2(四)
    Java框架之Struts2(三)
  • 原文地址:https://www.cnblogs.com/ZisZ/p/3334667.html
Copyright © 2011-2022 走看看