磨磨唧唧的唧唧 2022-01-07 14:37 采纳率: 50%
浏览 567
已结题

a+b正长小数版(c语言)

7-5 a+b(正长小数版) (5 分)
给定两个正的小数a,b,求a,b之和。需要注意的是,这两个小数的有效数字位数比较多,最大有100位有效数字。

输入格式:
两行,分别表示正小数a,b。该小数一定带有小数点。

输出格式:
两者之和。如果结果小数存在末尾0,均保留。

输入样例:
0.9999999999999999999999999999999999999999999999999999999999
0.0000000000000000000000000000000000000000000000000000000001
结尾无空行
输出样例:
1.0000000000000000000000000000000000000000000000000000000000

  • 写回答

3条回答 默认 最新

  • 关注

    代码如下:

    
    #include <stdio.h>
    #include <string.h>
    //计算小数的位数
    int xsws(char* buf)
    {
        int i=0;
        int cnt = 0;
        int flag = 0;
        while(buf[i] != '\0')
        {
            if(buf[i]=='.')
                flag = 1;
            else 
            {
                if(flag == 1)
                    cnt++;
            }
            i++;
        }
        return cnt;
    }
    
    int main()
    {
        char a[202]={0},b[202]={0};
        char c[202]={0}; //保存计算结果
        int i,j,t=0,shift = 0;
    
        int xs1=0,xs2=0,zs1=0,zs2=0; //记录a和b小数和整数的位数
        //读取a和b
        gets(a);
        gets(b);
        //计算两个数整数部分和小数部分的位数
        xs1 = xsws(a); zs1 = strlen(a) - xs1 -1;
        xs2 = xsws(b); zs2 = strlen(b) - xs2 -1;
    
        if (zs1 > zs2)
        {
            //将b后移zs1-zs2位
            for(i=strlen(b)-1;i>=0;i--)
                b[i+zs1-zs2] = b[i];
            for(i=0;i<zs1-zs2;i++)
                b[i]='0';
        }else if(zs2 > zs1)
        {
            //将a后移zs2-zs1位
            for(i=strlen(a)-1;i>=0;i--)
                a[i+zs2-zs1] = a[i];
            for(i=0;i<zs2-zs1;i++)
                a[i]='0';
        }
        //将小数部分补0
        if(xs1>xs2)
        {
            //将b最后补0
            t = strlen(b);
            for(i=0;i<xs1-xs2;i++)
                b[i+t] = '0';
        }else if(xs2>xs1)
        {
            //将a最后补0
            t = strlen(a);
            for(i=0;i<xs2-xs1;i++)
                a[i+t]='0';
        }
    
        
        printf("%s\n",a);
        printf("%s\n",b);
    
        //此时a和b的长度一致
        for (i=strlen(a)-1;i>=0;i--)
        {
            if(a[i]== '.')
            {
                c[i]='.';
                continue;
            }
            t = (a[i]-'0') + (b[i]-'0')+shift;
            shift = 0;
            if(t>=10)
            {
                t-=10;
                shift = 1;
            }
            c[i] = '0'+t; 
        }
        if(shift)
            printf("1%s",c); //如果进位是1,就先输出1,然后输出计算结果(进位不会超过1)
        else
            printf("%s",c);//如果进位是0,输出计算结果
        return 0;
        
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月15日
  • 已采纳回答 1月7日
  • 创建了问题 1月7日

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)