簡體   English   中英

在 C 中使用遞歸的二進制到十進制

[英]Binary to Decimal using recursion in C

我是這個編程的新手,當我使用這個代碼將二進制轉換為十進制時,當輸入大量數字時,output 將為負數。 有人可以幫我解決這個問題嗎?

#include <stdio.h>
int deci(int num);
int main()
{
    int bina;
    printf("Enter the Binary number:");
    scanf("%d",&bina);
    printf("The decimal is %d", deci(bina));
    return 0;
}
int deci(int num)
{
    if(num==0) return 0;
    return num%10+2*deci(num/10);
}

您的問題是您將輸入作為intint類型無法保存您嘗試使用的大輸入值。

例如二進制輸入: 11110000111100011110000int的最大值大得多。

您可以使用unsigned long long而不是int ,這會對您有所幫助。 但是還是不行!

如果我們假設您的輸入最多為 32 個二進制數(unsigned int 的典型大小)並且您的unsigned long long是 64 位,那么unsigned long long仍然無法處理像11110000111100011110000這樣的輸入。 所以程序會失敗。

解決方案是將輸入作為字符串而不是數字。

它看起來像這樣:

#include <stdio.h>
#include <inttypes.h>
#include <assert.h>

uint32_t deci_help(char* bina, uint32_t num)
{
    if(*bina == '\0') return num;
    assert(*bina == '0' || *bina == '1');
    return deci_help(bina+1, 2*num + (*bina - '0'));
}

uint32_t deci(char* bina)
{
    return deci_help(bina, 0);
}

int main()
{
    char bina[33];
    printf("Enter the Binary number:");
    scanf("%32s", bina);
    printf("The decimal is %"PRIu32, deci(bina));
    return 0;
}

輸入:

11111111111111111111111111110101

Output:

4294967285

順便說一句:遞歸不是這個任務的好解決方案,但我猜你需要使用遞歸。 更好的解決方案是一個簡單的 for/while 循環。

使用循環 function 可以是:

uint32_t deci(char* bina)
{
    uint32_t result = 0;
    while (*bina != '\0')
    {
        assert(*bina == '0' || *bina == '1');
        result = 2*result + (*bina - '0');
        ++bina;
    }

    return result;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM