首页 > 其他 > 详细

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

时间:2019-06-08 18:11:31      阅读:90      评论:0      收藏:0      [点我收藏+]

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

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

最近在写代码遇到这样一个问题:如何得到得到一个长整型数逆序后的长整型数?比如输入输入\(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)\)。更进一步,还有没有效率更高的算法能够解决这个问题呢?

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

原文:https://www.cnblogs.com/laizhenghong2012/p/10991202.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!