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"); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现