如何獲得長整數逆序後的整數


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

相關文章
相關標籤/搜索