目錄算法
注:原創不易,轉載請務必註明原做者和出處,感謝支持!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