[英]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);
}
您的問題是您將輸入作為int
但int
類型無法保存您嘗試使用的大輸入值。
例如二進制輸入: 11110000111100011110000
比int
的最大值大得多。
您可以使用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.