目录算法
注:原创不易,转载请务必注明原做者和出处,感谢支持!spa
最近在写代码遇到这样一个问题:如何获得获得一个长整型数逆序后的长整型数?好比输入输入\(a = 12345678\),获得输出\(ra=87654321\)。code
以下图,仔细分析输入数的特色,能够获得一个简单的递归算法来解决这个问题。blog
注:作图的时候最后倒数第二行少了加号递归
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\)的最大位权值计算出来,那为什么还用采用递归这种低效的计算方式呢?因而,一种效率更好一点的,能够避免递归的算法能够实现以下。get
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)\)。更进一步,还有没有效率更高的算法可以解决这个问题呢?it