qq_18147713 2021-12-07 14:47 采纳率: 73.8%
浏览 121
已结题

C语言编程问题求解答

描述
求2个浮点数相加的和

题目中输入输出中出现浮点数都有如下的形式:
P1P2...Pi.Q1Q2...Qj
对于整数部分,P1P2...Pi是一个非负整数
对于小数部分,Qj不等于0
关于输入
第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。每组测试数据之间有一个空行,每行数据不超过100个字符
关于输出
n行,每组测试数据有一行输出是相应的和。输出保证一定是一个小数部分不为0的浮点数
例子输入
2

0.111111111111111111111111111111

0.111111111111111111111111111111

10000000.655555555555555555555555555555

1.444444444444444444444444444445
例子输出
0.222222222222222222222222222222

10000002.1

  • 写回答

3条回答 默认 最新

  • 书山客 2021-12-07 15:44
    关注
    
    #include<stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main() {
        int numberArr = 0;
        scanf_s("%d", &numberArr);
        char resArr[50][100];
        for (int i = 0; i < numberArr; i++) {
            char firstStr[100];
            memset(firstStr, 0, 100);
            char secendStr[100];
            memset(secendStr, 0, 100);
            char resStr[100];
            memset(resStr, 0, 100);
            char* buf;
            scanf_s("%s", firstStr, 100);
            scanf_s("%s", secendStr, 100);
            char* str1f = strtok_s(firstStr, " ." ,&buf);   //第一个数的整数部分
            char* str1i = str1f;
            if (str1f != NULL)
            {
                str1f = strtok_s(NULL, " .", &buf);         //第一个数的小数部分
            }
            char* str2f = strtok_s(secendStr, " .", &buf);  //第二个数的整数部分
            char* str2i = str2f;
            if (str2f != NULL)
            {
                str2f = strtok_s(NULL, " .", &buf);         //第一个数的小数部分
            }
            int firstLen = strlen(str1f);             //第一个数小数部分长度
            int secendLen = strlen(str2f);          //第二个数小数部分长度
            int firstLenI = strlen(str1i);             //第一个数小数部分长度
            int secendLenI = strlen(str2i);          //第二个数小数部分长度
            if (firstLen > secendLen)
            {
                char resf[100];
                char resi[100];
                memset(resf, 0, 100);
                memset(resi, 0, 100);
                int carry = 0;
                bool isLastE = true;
                for (int j = (firstLen-1); j >= 0; j--)
                {
                    if (j > (secendLen-1))
                    {
                        resf[j] = str1f[j];
                    }
                    else
                    {
                        //resf[j] = '0';
                        resf[j] = (char)(((int)str1f[j] + (int)str2f[j] + carry - 96) % 10) + 48;
                        carry = ((int)str1f[j] + (int)str2f[j] + carry - 96) / 10;
                    }
                    if (resf[j] != '0' && isLastE)
                    {
                        isLastE = false;
                    }
                    if (resf[j]=='0' && isLastE)
                    {
                        resf[j] = '\0';
                    }
    
                }
                int firstI = atoi(str1i);
                int secendI = atoi(str2i);
                sprintf_s(resi,"%d", (firstI + secendI+carry));
                if (resf == NULL || resf[0] == '\0')
                    sprintf_s(resArr[i], 100, "%s", resi);
                else
                    sprintf_s(resArr[i], 100, "%s.%s", resi, resf);
            }
            else
            {
                char resf[100];
                char resi[100];
                memset(resf, 0, 100);
                memset(resi, 0, 100);
                int carry = 0; 
                bool isLastE = true;
                for (int j = (secendLen - 1); j >= 0; j--)
                {
                    if (j > (firstLen - 1))
                    {
                        resf[j] = str1f[j];
                    }
                    else
                    {
                        //resf[j] = '0';
                        resf[j] = (char)(((int)str1f[j] + (int)str2f[j] + carry - 96) % 10) + 48;
                        carry = ((int)str1f[j] + (int)str2f[j] + carry - 96) / 10;
                    }
                    if (resf[j] != '0' && isLastE)
                    {
                        isLastE = false;
                    }
                    if (resf[j] == '0' && isLastE)
                    {
                        resf[j] = '\0';
                    }
                }
                int firstI = atoi(str1i);
                int secendI = atoi(str2i);
                sprintf_s(resi, "%d", (firstI + secendI + carry));
                if (resf == NULL || resf[0] == '\0')
                    sprintf_s(resArr[i], 100, "%s", resi);
                else
                    sprintf_s(resArr[i], 100, "%s.%s", resi, resf);
            }
        }
        for (int i = 0; i < numberArr; i++)
        {
            printf("%s\n",resArr[i]);
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月16日
  • 已采纳回答 12月8日
  • 创建了问题 12月7日

悬赏问题

  • ¥15 求帮生成一个lattice diamond的许可证
  • ¥15 大一前端新生求教学解答
  • ¥15 如何制作一个可以查看“网游有序列的装备词条”的软件/插件
  • ¥15 CS2打5E与完美天梯匹配会与服务器断开连接(黑框没标明具体原因)
  • ¥15 利用cst反推材料电磁参数,推出想x,y,z方向的相对介电常数与磁导率
  • ¥15 求帮助!用赛灵思FPGA XC7A35T对一个频率50MHz的数字信号读取高低电平,只用HR bank普通单端io进行采样可以吗
  • ¥15 训练准确率100%,测试准确率只有50%
  • ¥15 grafana创建dashhabord提示no data sources of type Prometheus Alert
  • ¥15 python用arima时间序列法预测不出结果 急
  • ¥15 思科交换机如何恢复配置