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


#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;
}


#include<stdio.h>
#include<string.h>
int main(){
    char str1[150],str2[150];
    while(gets(str1)){
        gets(str2);
        int len1=strlen(str1);
        int len2=strlen(str2);
        int apoint,bpoint;
        for(int i=0;i<len1;i++){
            if(str1[i]=='.'){
                apoint=i;
                break;
            }
        }
        for(int i=0;i<len2;i++){
            if(str2[i]=='.'){
                bpoint=i;
                break;
            }
        }
        if(apoint>bpoint){//                  str2后移整数补0
            int c=apoint-bpoint;
            for(int i=len2-1;i>=0;i--){
                str2[i+c]=str2[i];
            }
            for(int i=0;i<c;i++){
                str2[i]='0';
            }
            len2=len2+c;
            bpoint=apoint;
        }
        else{//                  str1后移整数补0
            int c=bpoint-apoint;
            for(int i=len1-1;i>=0;i--){
                str1[i+c]=str1[i];
            }
            for(int i=0;i<c;i++){
                str1[i]='0';
            }
            len1=len1+c;
            apoint=bpoint;
        }
        if(len1>len2){//                       str2小数补0
            for(int i=len2;i<len1;i++){
                str2[i]='0';
                len2=len1;
            }
        }
        else{//                       str1小数补0
            for(int i=len1;i<len2;i++){
                str1[i]='0';
                len1=len2;
            }
        }
        int a[150],b[150];//         b保存整数,a保存小数
        int idx1,idx2,carry1,carry2;
        idx1=idx2=carry1=carry2=0;
        for(int i=len1-1;i>apoint;i--){
            a[idx1++]=(str1[i]-'0'+str2[i]-'0'+carry1)%10;
            carry1=(str1[i]-'0'+str2[i]-'0'+carry1)/10;
        }
        carry2=carry1+carry2;
        for(int i=apoint-1;i>=0;i--){
            b[idx2++]=(str1[i]-'0'+str2[i]-'0'+carry2)%10;
            carry2=(str1[i]-'0'+str2[i]-'0'+carry2)/10;
        }
        if(carry2!=0){
            b[idx2++]=carry2;
        }
        //b[]从后往前输出,在输出小数点,从后往前输出a[]//
        for(int i=idx2-1;i>=0;i--){
            printf("%d",b[i]);
        }
        printf(".");
        for(int i=idx1-1;i>=0;i--){
            printf("%d",a[i]);
        }
        printf("\n");
    }
    return 0;
}

可以参考以下高精度整数的运算,进行尝试解答此题!