109 大实数加法

问题描述 :

给你两个正的实数A和B,你的任务是计算出A+B的值。

 

输入说明 :

本题目包含T组测试数据。

每一组测试数据在一行里面包含两个长度不大于400的正实数A和B,A和B均无多余的前导0。

 

输出说明 :

对于每一组测试数据,请在一行里面输出输出A+B的值,行首与行尾均无空格。

运算结果最后的0(比如1.400)不需要输出(输出为1.4)。

输入范例 :

3
1.1 2.9
1.1111111111 2.3444323343
1 1.1

输出范例 :

4
3.4555434454
2.1

思想:类似上面的大数加法,单独考虑小数部分即可。

复制代码
#include <stdio.h>
#include <string.h>

int main()
{
    int num, i, j, k;
    scanf("%d", &num);
    for (k = 0; k < num; k++)
    {
        char n[1000];
        char num1[400];   //数一整数部分
        char num1sn[400]; //数一小数部分
        memset(num1sn, '0', 400);  //初始化全为字符0,方便后面统一处理
        int count1 = 0;  //整数计数
        int count1sn = 0;  //小数计数
        char num2[400];   //数二整数部分
        char num2sn[400]; //数二小数部分
        memset(num2sn, '0', 400); //初始化全为字符0,方便后面统一处理
        int count2 = 0;
        int count2sn = 0;
        char res[500];
        int count3 = 0;
        if (k == 0)
        {
            getchar(); //首行输入 吸收一下回车
        }

        gets(n);
        int flag = 0; //进位标志
        int dot1flag = 0;
        int dot2flag = 0;
        for (i = 0; i < strlen(n); i++) //第一个数字
        {
            if (n[i] != ' ')
            {
                if (n[i] == '.')
                {
                    dot1flag = 1;
                    continue;
                }
                if (!dot1flag)
                {
                    num1[count1++] = n[i];
                }
                else
                {
                    num1sn[count1sn++] = n[i];
                }
            }else{
                i++;
                break;
            }
        }
        for (; i < strlen(n); i++) //第二个数字
        {
            if (n[i] == '.')
                {
                    dot2flag = 1;
                    continue;
                }
                if (!dot2flag)  //整数部分
                {
                    num2[count2++] = n[i];
                }
                else  //小数部分
                {
                    num2sn[count2sn++] = n[i];
                }
        }
        count1--; // count指向了后一个数 所以还原一下
        count2--;
        count1sn--;
        count2sn--;
        if(count1sn>count2sn){
            count2sn = count1sn;
        }else{
            count1sn = count2sn;
        }
        while (count1sn>= 0) //进行加法
        {
            int temp = num1sn[count1sn--] - '0' + num2sn[count2sn--] - '0' + flag;
            flag = 0;
            if (temp >= 10)
            {
                flag = 1;
                temp %= 10;
            }
            res[count3++] = temp + '0';
        }
        res[count3++] = '.';
        while (count1 >= 0 && count2 >= 0) //进行加法
        {
            int temp = num1[count1--] - '0' + num2[count2--] - '0' + flag;
            flag = 0;
            if (temp >= 10)
            {
                flag = 1;
                temp %= 10;
            }
            res[count3++] = temp + '0';
        }
        if (count1 == -1 && count2 == -1 && flag) //如果两个数都加完了,还往前进一位的情况
        {
            res[count3++] = flag + '0';
        }
        else
        {
            while (count1 >= 0) // 1数的高位 累加进位处理
            {
                int temp = num1[count1--] - '0' + flag;
                flag = 0;
                if (temp >= 10)
                {
                    flag = 1;
                    temp %= 10;
                }
                res[count3++] = temp + '0';
            }
            while (count2 >= 0) // 2数的高位 累加进位处理
            {
                int temp = num2[count2--] - '0' + flag;
                flag = 0;
                if (temp >= 10)
                {
                    flag = 1;
                    temp %= 10;
                }
                res[count3++] = temp + '0';
            }
        }
        int start = 0;
        for(i =0;;i++){  //处理后面多余的0
            if(res[i]=='0'){
                start++;
            }else{
                break;
            }
        }
        if(res[start]=='.'){  //如果多余的0除去后发现小数部分结束了,那么小数点也消去,比如3.00000 ->3. ->3
            start++;
        }
        for (i = count3 - 1; i >= start; i--)
        {
            printf("%c", res[i]);
        }
        printf("\n");
    }
}
复制代码

 

posted @   梦想是能睡八小时的猪  阅读(90)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示