2015-06-03 74 views
0

的數字,我發現這個代碼不明白反轉一些

#include <stdio.h> 
#include <math.h> 

int rev(int num) 
{ 
    if(num < 10) 
     return num; 
    else 
     return (num % 10) * pow(10, (int)log10(num)) + rev(num/10); 
} 

int main(void) 
{ 
    printf("%d\n", rev(12345)); 

    return 0; 
} 

而且我開始分析它這個遞歸函數,但現在我有一個疑問,這是下面,返回到起點根據我的理解,用(num%10)得到的值應該是(1,2,3,4,5),但是當嘗試手動進行計算時,我沒有得到期望值。

這裏發生了什麼,如果有人向我解釋這個,或者我錯過了什麼?

+0

什麼是「投資者數字」? – Olaf

+0

它應該是相反的順序,不是? rev(12345)= 50000 + rev(1234)= 54000 + rev(123)= ... = 54321. –

+0

請寄出預期的產量和實際產量。 – QuestionC

回答

4
int rev(int num) // num = 12345 
{ 
    if(num < 10) // false 
     return num; 
    else 
     return (num % 10) * pow(10, (int)log10(num)) + rev(num/10); 
     //  (12345 % 10) * 10^(log 12345) + rev(12345/10); 
     //  5 * 10^(4) + rev (1234) 
     //  50000 + rev(1234) 
} 

在此基礎上,我們可以假設:

rev(12345) = 50000 + rev(1234) 
rev(1234) = 4000 + rev(123) 
rev(123) = 300 + rev(12) 
rev(12) = 20 + rev(1) 
rev(1) = 1 

所以,最終的結果是:

rev(12345) = 50000 + 4000 + 300 + 20 + 1 = 54321 

這是一個簡單的數學,唯一的非平凡的規則是(int)log10(num) ,但@QuestionC在他的評論中解釋了這一點。

+0

這使我更困惑 – Kevin

+0

它有助於指出'log10(x)'返回一個浮點值, AB'其中'A'是'x'中的位數。所以'(int)log10(num)'是'num'中的位數。這只是基數爲10的對數的數學性質。 – QuestionC

+0

呃,它返回1比位數少。 – QuestionC