2014-06-16 51 views
2

我想通過遞歸編碼C中的東西。找到一個遞歸的兩位數字

用戶寫入2相同的長度的正數和節目給他一個新的號碼,它是由這樣的:

新號碼統一位=在第二正數的最小數字用戶中寫道。

新號碼十位=用戶寫入的第一個正數中的最大數字。

很簡單,其實,這裏有一個例子:

56422371

會給我們:61


我想是這樣的:

#include <stdio.h> 

int calcPair(int a, int b){ 

    int number = calcPair(a/10, b/10); 
    int digit1 = (number/10); 
    int digit2 = number%10; 

    if(digit1 < a%10){ 
     digit1 = a%10; 
    } 
    if(digit2 > b%10){ 
     digit2 = b%10; 
    } 

    return(number); 
} 

int main() 
{ 
    int a, b, number=0; 
    printf("Please enter two positive number of same length:\n"); 
    scanf("%d", &a); 
    scanf("%d", &b); 

    calcPair(a, b); 
    printf("The two-digit number composed from %d, %d is: %d", a, b, number); 
    return 0; 
} 

但程序並不運行在所有..和關閉。

也許有人能糾正我?或者幫我找到錯誤

提前致謝。

+0

想法:既然它的「用戶寫兩個正數」,使用'unsigned'而不是'int'。可能不會影響你目前的問題,但。 – chux

+0

只是看你的代碼,它只是不斷調用自己的輸入除以10.你有無限遞歸。你需要有一個路徑,它只是返回一個答案,而不是對自己的呼叫。 – Jiminion

+1

@Jim:類似的東西:if digit 2 == .. && digit 1 == .. so return(number)?謝謝。 – user3605367

回答

1

事情是這樣的:

int calcPair(int a, int b){ 
    int number; 
    if (a < 10 && b < 10) { 
     number = a*10 + b; 
    } else { 
     int digita = a%10; 
     int digitb = b%10; 
     number = calcPair(a/10, b/10);  

     if(digita > number/10){ 
      number = digita*10 + number%10; 
     } 

     if(digitb < number%10){ 
      number = (number/10)*10 + digitb; 
     } 
    } 
    return number; 
} 

而且,一個小補丁到主:

int main() 
{ 
    int a, b, number=0; 
    printf("Please enter two positive number of same length:\n"); 
    scanf("%d", &a); 
    scanf("%d", &b); 

    number = calcPair(a, b); 
    printf("The two-digit number composed from %d, %d is: %d", a, b, number); 
    return 0; 
} 
+0

Thx的解釋,但是當我測試你的代碼時,我總是得到0 .. @Jim – user3605367

+0

這是一個框架;我不確定我是否知道這些細節是正確的。 – Jiminion

+0

作了一個小的編輯更改。 – Jiminion

3

您的遞歸永遠不會結束。考慮calcPair以下行:

int number = calcPair(a/10, b/10); 

,除非你是有條件該聲明就一定會執行,如:

int number; 
if((a != 0) || (b != 0)) 
    number = calcPair(a/10, b/10); 

最後,因爲你除以10,這兩個數字,這個條件將證明FALSE

+0

Hi @Fidding位,就像第二個答案一樣,當我測試你的代碼時,我總是得到0。 – user3605367

+0

我知道我必須提出一個條件來停止遞歸併避免錯誤,但是您寫的條件似乎不起作用。 – user3605367

+0

@ user3605367遞歸將結束,我建議的修復,但是,'calcPair'中的邏輯不正確。 –

1

無論你是否被允許(你沒有在OP註明) ,
這裏是遞歸搜索方法使用字符串

字符串只是的char陣列。因爲您有興趣區分較大整數內的個別數字,因此數據類型將是足夠大小的容器以便於比較。
在退出條件爲strlen()> 0的遞歸函數中使用char(字符串)數組將允許您遍歷每個整數,並選擇適當的值(最小值或最大值)。
這種方法使用兩個遞歸功能getMinDigit()getMaxDigit(),二者返回表示最大值數位,或它們各自的原始多位整數的最小值位炭。這些結果然後連接起來,並轉換回兩位數的整數。

下面是示例代碼,鑑於:

5642和2371

會給我們:61

char getMinDigit(char *digit) 
{ 
    static char val='9';//largest single digit base 10 
    int len=0; 
    if(strlen(digit) > 0) 
    { 
     len = strlen(digit); 
     if(digit[len-1] < val) //test for smallest char in string 
     { 
      val = digit[len-1]; 
      digit[len-1] = 0; 
      getMinDigit(digit); 
     } 
     else 
     { 
      digit[len-1] = 0; 
      getMinDigit(digit); 
     } 

    } 
    return val; 
} 

char getMaxDigit(char *digit) 
{ 
    static char val='0'; //smallest single digit base 10 
    int len=0; 

    if(strlen(digit) > 0) 
    { 
     len = strlen(digit); 
     if(digit[len-1] > val) //search for largest char in string 
     { 
      val = digit[len-1]; 
      digit[len-1] = 0; 
      getMaxDigit(digit); 

     } 
     else 
     { 
      digit[len-1] = 0; 
      getMaxDigit(digit); 
     } 
    } 
    return val; 

} 

int calcPair(int a, int b) 
{ 
    char big[10]={""}, small[10]={""}; 
    char Big, Small; 
    char result[3]={""}; 
    sprintf(big, "%d", a); 
    sprintf(small, "%d", b); 
    Big = getMaxDigit(big); //recursive function 
    Small = getMinDigit(small); //recursive function 
    sprintf(result, "%c%c", Big, Small); 
    return atoi(result); 

} 



int main(void) 
{ 
    int result = calcPair(5642, 2371); 
    printf("%d", result); 
    return 0; 
//for illustration, hard coded to OP values 
     //int a, b, number=0; 
     //printf("Please enter two positive number of same length:\n"); 
     //scanf("%d", &a); 
     //scanf("%d", &b); 

     //calcPair(a, b); 
     //printf("The two-digit number composed from %d, %d is: %d", a, b, number); 
     //return 0; 



} 
+0

不,我不能在這裏使用字符串:)但感謝的方法,事實上很有趣。 @ryyker。 – user3605367

+0

太糟糕了:)字符串,在這個問題中很容易操作和閱讀。 – ryyker

1

我想你可以重構你的代碼更表達你的需求,並帶有一些輔助功能。

int greater(int a, int b) 
{ 
    return (a>b); 
} 

int less(int a, int b) 
{ 
    return (a<b); 
} 

int pickDigit(int n, int (*func)(int, int)) 
{ 
    int ret = n%10; 
    n /= 10; 
    while (n > 0) 
    { 
     if (fun(n%10, ret)) 
     { 
     ret = n%10; 
     } 
     n /= 10; 
    } 
    return ret; 
} 

int getBiggestDigit(int n) 
{ 
    return pickDigit(n, greater); 
} 

int gteSmallestDigit(int n) 
{ 
    return pickDigit(n, less); 
} 

int numDigits(int n) 
{ 
    int ret = 0; 
    while (n > 0) 
    { 
     ++ret; 
     n /= 10; 
    } 
    return ret; 
} 

int calcPair(int a, int b) 
{ 

    if (numDigits(a) != numDigits(b)) 
    { 
     // Deal with error. 
    } 

    return betBiggestDigit(a)*10+getSmallestDigit(b); 
}