婧Jing2005 2024-04-18 20:34 采纳率: 40%
浏览 7

c语言二进制转十进制

#为什么样例都通过了还是不能拿满分呢?
题目
二进制转十进制【C/C++/Java/Python】
描述
给定一个正的二进制数,将其转换为十进制数输出。

例如二进制数:110100101,转成十进制数是:421

例如二进制数:110110110,转成十进制数是:438

格式
输入格式
一个正的二进制数,其长度不超过31位

输出格式
对应的十进制正整数

样例
输入样例
101011010
输出样例
346
限制
时间限制:100 ms

内存限制:20480 KB
补充样例:
测试点 1
输入
10
输出
2
测试点 2
输入
1100
输出
12
测试点 3
输入
101010
输出
42
测试点 4
输入
110110111
输出
439
测试点 5
输入
110011000011
输出
3267
我的代码


#include <stdio.h>
#include <math.h>
int main()
{
    long long n;
    scanf("%lld",&n);
    int b,x=0,i=0;
    while(n!=0)
    {
        int m=1;
        b=n%10;
        n/=10;
        if(b==1)
        {
            x+=pow(2,i);
        }
        ++i;
    } 
    printf("%d",x);
    return 0;
}
  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-18 20:34
    关注

    引自免费微信小程序:皆我百晓生

    在您的代码中,有一个小错误导致可能无法得到满分。pow() 函数在 C 语言中用于计算实数的幂,而您在这里试图对整数 2 进行整数次方运算。这可能会导致精度问题,因为 pow(2, i) 返回的是浮点数,然后将浮点数转换为整数时可能会丢失精度。

    要解决这个问题,您可以使用简单的乘法来替代 pow(2, i),即 x += (b == 1) ? 1 << i : 0;。这样可以确保每次迭代都将 2 的适当次方加到结果上,且不会涉及浮点数操作。

    以下是修改后的代码:

    #include <stdio.h>
    
    int main()
    {
        long long n;
        scanf("%lld", &n);
        int b, x = 0, i = 0;
        while (n != 0)
        {
            b = n % 10;
            n /= 10;
            if (b == 1)
            {
                x += 1 << i;
            }
            ++i;
        } 
        printf("%lld", x); // 注意这里修改为了 %lld,以适应可能更大的结果
        return 0;
    }
    

    现在,这段代码应该能正确处理所有测试用例,并且在大多数情况下可以获得满分。然而,请注意,由于使用了 long long 类型,这个程序对于非常大的二进制数(接近 long long 类型的最大值)仍然可能有局限性。如果需要处理更大范围的二进制数,可能需要考虑其他数据结构或算法。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月18日

悬赏问题

  • ¥15 python怎么在已有视频文件后添加新帧
  • ¥20 虚幻UE引擎如何让多个同一个蓝图的NPC执行一样的动画,
  • ¥15 fluent里模拟降膜反应的UDF编写
  • ¥15 MYSQL 多表拼接link
  • ¥15 关于某款2.13寸墨水屏的问题
  • ¥15 obsidian的中文层级自动编号
  • ¥15 同一个网口一个电脑连接有网,另一个电脑连接没网
  • ¥15 神经网络模型一直不能上GPU
  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵