二进制到十进制的转换C代码-满足特定测试用例的问题

时间:2019-04-25 11:13:08

标签: c

C程序将输入的二进制数字转换为十进制数字

该代码对于输入10001000、101100的输出分别为136和44可以正常工作,但是对于以下情况却失败了

我的代码:

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

int main() {
    int t,i,s,r;
    int b;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&b);
        i=0;
        s=0;
        while(b!=0)
        {
            r=b%10;
            s=s+r*pow(2,i);
            b=b/10;
            i++;
        }
        printf("%d\n",s);
    }
    return 0;
}

第一个测试用例满足以下条件:
对于输入:
2
10001000
101100
您的输出是:
136
44
以下测试用例不满足,错误如下:
输出错误:
错误的答案。 !!!错误的答案
您的代码可能不适用于多个测试用例(TC)。
您的代码失败的第一个测试用例:

输入:
11111111111

其正确的输出是:
2047

您的代码的输出为:
-3809
有人可以建议我进行必要的更改吗?

2 个答案:

答案 0 :(得分:3)

您的代码还有其他几个问题-您试图将字符串“ 11111111111”(11乘以“ 1”)解释为整数。但是,计算机上的整数类型使用4个字节,并且它可以表示的最大数字为2 ^ 31-1。数字11,111,111,111大于2 ^ 33。所以-您得到signed integer overflow的行为。

尝试将您的输入解析为字符串,而不是很大的数字...

但是-下次,请:

  1. 使用适当的缩进。
  2. 使用有意义的变量名(例如number_of_conversions,而不是t)。
  3. 使用 minimum 示例。例如,我们不需要在t上进行外部循环-您只需一次转换就可以证明您的问题。
  4. 检查库调用的结果! scanf()可能会失败。

答案 1 :(得分:0)

在声明变量时,通过使用增加 int 的范围 int 之前的“unsigned long long”。 使用 scanf 函数时,使用格式说明符“%lld”。