zoukankan      html  css  js  c++  java
  • 如何得到长整数逆序后的整数


    注:原创不易,转载请务必注明原作者和出处,感谢支持!

    一 如何得到长整数逆序后的整数

    最近在写代码遇到这样一个问题:如何得到得到一个长整型数逆序后的长整型数?比如输入输入(a = 12345678),得到输出(ra=87654321)

    如下图,仔细分析输入数的特点,可以得到一个简单的递归算法来解决这个问题。

    注:做图的时候最后倒数第二行少了加号

    void reverse(unsigned long a, unsigned long *sum, unsigned long power)
    {
        if (a > 10)
            reverse(a/10, sum, power/10);
        *sum += (a % 10) * power;
    }
    
    unsigned long get_reverse(unsigned long a)
    {
        /* 根据a的位数确定最大位权值 */
        int i;
        unsigned long power = 1;
        char buf[16];
        sprintf(buf, "%lu", a);
        for (i = 0; i < strlen(buf) - 1; i++)
            power *= 10;
    
        /* 调用reverse() */
        unsigned long sum = 0;
        reverse(a, &sum, power);
        return sum;
    }
    

    回过头来想上面的代码,会发现既然借用sprintf()能够轻而易举地将(a)的最大位权值计算出来,那为何还用采用递归这种低效的计算方式呢?于是,一种效率更好一点的,可以避免递归的算法可以实现如下。

    unsigned long get_reverse(unsigned long a)
    {
        /* 根据a的位数确定最大位权值 */
        int i;
        unsigned long power = 1;
        char buf[16];
        sprintf(buf, "%lu", a);
        for (i = 0; i < strlen(buf) - 1; i++)
            power *= 10;
    
        unsigned long sum = 0;
        for (i = strlen(buf) - 1; i >= 0; i--)
        {
            sum += (buf[i] - '0') * power;
            power /= 10;
        }
        return sum;
    }
    

    上述代码的复杂度为:(O(strlen(a)) = O(log~a))。更进一步,还有没有效率更高的算法能够解决这个问题呢?

  • 相关阅读:
    分布式机器学习:算法、理论与实践——【1】
    LLVM Cookbook
    【前端】Webpack 进阶
    Noip2015 运输计划 树上差分 二分答案
    bzoj 2259: [Oibh]新型计算机 最短路 建模
    888E
    [ZJOI2012]旅游 对偶图 树的直径
    [HAOI2007]理想的正方形 单调队列 暴力
    bzoj1457: 棋盘游戏 SG函数 Nim
    Bomb HDU
  • 原文地址:https://www.cnblogs.com/laizhenghong2012/p/10991202.html
Copyright © 2011-2022 走看看