渐江建工水利水电建设有限公司网站,新乡商城网站建设,wordpress调用tag标签带超链接,免费设计室内装修app软件目录 一 如何得到长整数逆序后的整数注#xff1a;原创不易#xff0c;转载请务必注明原作者和出处#xff0c;感谢支持#xff01; 一 如何得到长整数逆序后的整数 最近在写代码遇到这样一个问题#xff1a;如何得到得到一个长整型数逆序后的长整型数#xff1f;比如输入… 目录 一 如何得到长整数逆序后的整数 注原创不易转载请务必注明原作者和出处感谢支持 一 如何得到长整数逆序后的整数 最近在写代码遇到这样一个问题如何得到得到一个长整型数逆序后的长整型数比如输入输入\(a 12345678\)得到输出\(ra87654321\)。 如下图仔细分析输入数的特点可以得到一个简单的递归算法来解决这个问题。 注做图的时候最后倒数第二行少了加号 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