洛谷 题解 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;
}
通过详情

 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号