题目描述
大数加法问题
大数的输入不能简单定义整数变量,因为存不下这么大的数,要采用字符串输入方式,把大数存入到字符串中,按照数码位个位对齐,逐个数码位相加
数字字符做对应数值的加法规则
'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已经加完,则取0
int digit2 = (j >= 0) ? num2[j] - '0' : 0; // 如果num2已经加完,则取0
int 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;
}
标签:num1,num2,大数,int,start,result From: https://blog.csdn.net/ssssswwzm/article/details/144753627