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

A+B Problem(高精)

题目描述

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

输入格式

分两行输入。a,b10500

输出格式

输出只有一行,代表 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 @   残影0无痕  阅读(141)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示