题目描述
大数加法问题
大数的输入不能简单定义整数变量,因为存不下这么大的数,要采用字符串输入方式,把大数存入到字符串中,按照数码位个位对齐,逐个数码位相加
数字字符做对应数值的加法规则
'5'+'8' => ('5'-'0')+('8'-'0')=13
13表示有个进位1 ,数字3=> 3+'0' =>'3'
本题求多组大数的加法,结果每行占一行
输入
第一行输入一个整数n(n<=20)
以下n行中每行包含两个整数(大数)
输出
求两个大数和的结果,每行一个
样例输入
2 111111111111111111111 222222222222222222222 999 888
样例输出
333333333333333333333 1887
提示
两个大数的输入可以采用scanf("%s %s",a,b);
#include <stdio.h>
#include <string.h>#define MAX_LENGTH 110 // 为了存储大数,设置一个足够大的长度void addLargeNumbers(char* num1, char* num2, char* result) {int len1 = strlen(num1);int len2 = strlen(num2);int carry = 0; // 进位int i, j, k;// 从尾部开始加for (i = len1 - 1, j = len2 - 1, k = 0; i >= 0 || j >= 0 || carry; i--, j--, k++) {int digit1 = (i >= 0) ? num1[i] - '0' : 0; // 如果num1已经加完,则取0int digit2 = (j >= 0) ? num2[j] - '0' : 0; // 如果num2已经加完,则取0int sum = digit1 + digit2 + carry; // 计算当前位的和carry = sum / 10; // 计算进位result[k] = (sum % 10) + '0'; // 记录当前位}// 反转结果字符串result[k] = '\0'; // 添加字符串结束符for (int start = 0, end = k - 1; start < end; start++, end--) {char temp = result[start];result[start] = result[end];result[end] = temp;}
}int main() {int n;scanf("%d", &n); // 读取测试案例的数量for (int i = 0; i < n; i++) {char num1[MAX_LENGTH], num2[MAX_LENGTH], result[MAX_LENGTH];scanf("%s %s", num1, num2); // 读取两个大数addLargeNumbers(num1, num2, result); // 进行大数加法printf("%s\n", result); // 打印结果}return 0;
}