洛谷 题解 P1601 A+B Problem(高精)

A+B Problem(高精)

题目描述

高精度加法,相当于 a+b problem,不用考虑负数

输入格式

分两行输入。\(a,b \leq 10^{500}\)

输出格式

输出只有一行,代表 \(a+b\) 的值。

样例 #1

样例输入 #1

1
1

样例输出 #1

2

样例 #2

样例输入 #2

1001
9099

样例输出 #2

10100

样例 #3

样例输入 #3

11111111111111111111111111
9999999999999999999999999999999999

样例输出 #3

10000000011111111111111111111111110

题解

思路

1.数据读取

2.进位相加

3.倒序输出

C代码

#include <stdio.h>
#include <string.h>

int main() {
	char left[505], right[505], ans[505];
	scanf("%s %s", left, right);
	int len_left = strlen(left), len_right = strlen(right);
	
	/*这里将‘0’-‘9’的字符类型转换为数字0-9,便于之后的求和*/
	for (int i = 0; i <= len_left - 1; i++)
		left[i] = left[i] - '0';
	for (int i = 0; i <= len_right - 1; i++)
		right[i] = right[i] - '0';
	
	int ptr_ans = 0, ptr_left = len_left - 1, ptr_right = len_right - 1;//用ptr来指向该数组的操作位
	int plus_ten = 0;//用plus_one来记录是否进位
	
	/*从两个数组的个位开始,将两个数的匹配位置相加*/
	while (ptr_left >= 0 && ptr_right >= 0) {
		ans[ptr_ans] = left[ptr_left] + right[ptr_right] + plus_ten;
		plus_ten = ans[ptr_ans] / 10;
		ans[ptr_ans] = ans[ptr_ans] % 10;
		ptr_ans++;
		ptr_left--;
		ptr_right--;
	}
	
	/*如果两个数字位数不同,则将更长的那个数字的剩余位数也加进ans数组中*/
	while (ptr_left >= 0) {
		ans[ptr_ans] = left[ptr_left] + plus_ten;
		plus_ten = ans[ptr_ans] / 10;
		ans[ptr_ans] = ans[ptr_ans] % 10;
		ptr_ans++;
		ptr_left--;
	}
	while (ptr_right >= 0) {
		ans[ptr_ans] = right[ptr_right] + plus_ten;
		plus_ten = ans[ptr_ans] / 10;
		ans[ptr_ans] = ans[ptr_ans] % 10;
		ptr_ans++;
		ptr_right--;
	}
	
	/*如果最后一位相加时还出现进位,则将其单独输出*/
	if (plus_ten)
		printf("%d", plus_ten);
	
	/*个位在ans[0]的位置,所以要倒序输出*/
	for (int i = ptr_ans - 1; i >= 0; i--)
		printf("%d", ans[i]);
		
	return 0;
}

通过详情

image

posted @ 2022-10-21 21:08  残影0无痕  阅读(197)  评论(0)    收藏  举报