洛谷P1601(C语言,高精度加法)

A+B Problem(高精)

题目描述

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

输入格式

分两行输入。 a , b ≤ 1 0 500 a,b \leq 10^{500} a,b10500

输出格式

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

样例 #1

样例输入 #1

1
1

样例输出 #1

2

样例 #2

样例输入 #2

1001
9099

样例输出 #2

10100

提示

20 % 20\% 20% 的测试数据, 0 ≤ a , b ≤ 1 0 9 0\le a,b \le10^9 0a,b109

40 % 40\% 40% 的测试数据, 0 ≤ a , b ≤ 1 0 18 0\le a,b \le10^{18} 0a,b1018

分析

  1. 更加具体的分析在这里(点击查看高精度算法
    这里我凝练一下语言:用数组存储要操作的数,将各个数字拆开相加(注意进位),类比小学加法
  2. 讲一下这题的前导 0 的情况
    因为我们是从后往前倒着输出的,并且一开始给数组c全赋值为 0 ,数组c的长度是数组a、b长度中最大的还要加一,就会出现这种情况:
   a[0] a[1] a[2]
     4    3    2
+  b[0] b[1]
     1    2
   c[0] c[1] c[2] c[3]
     5    5    2    0
     这样输出的结果是0255,所以要处理前导0,但也要注意0 + 0 = 0的情况

前导 0 处理代码模块:

lenc = lenc - 1;                             | 数组a、b放的都是0,lena=lenb=1
	if (lenc >= 1) {                         | lenc = 1 + 1 = 2
		while (c[lenc] == 0 && lenc >= 1) {  | c[0] c[1]
			lenc--;                          |   0    0
		}                                    | 那个while循环中的lenc>=1就是防
	}                                        | 止把c[0]0也处理了

代码

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

//这里是写了个翻转方法
void reverse (int d[510], int len) {
	int temp, mid = len/2;
	for (int i = 0, j = len - 1; i < mid, j >= mid; i++, j--) {
		temp = d[i];
		d[i] = d[j];
		d[j] = temp;
	}
}

int main () {
	int a[510] = {0}, b[510] = {0}, c[510] = {0};
	char s1[510], s2[510];
	scanf("%s", s1);
	scanf("%s", s2);
	int lena = strlen(s1);
	int lenb = strlen(s2);
	int lenc = (lena > lenb) ? (lena + 1) : (lenb + 1);
	
	//将char的1转为int的1
	for (int i = 0; i < lena; i++) {
		a[i] = s1[i] - '0';
	}
	for (int i = 0; i < lenb; i++) {
		b[i] = s2[i] - '0';
	}
	
	reverse(a, lena);
	reverse(b, lenb);
	
	//开始加了
	for (int i = 0; i < lenc; i++) {
		c[i] += a[i] + b[i];
		c[i+1] = c[i] / 10;
		c[i] = c[i] % 10;
	}
	
	//处理前导0
	lenc = lenc - 1;
	if (lenc >= 1) {
		while (c[lenc] == 0 && lenc >= 1) {
			lenc--;
		}
	}
	
	//输出结果
	for (int i = lenc; i >=0; i--) {
		printf ("%d", c[i]);
	}
	
	return 0;
}

最后,如果我有遗漏的地方,欢迎大家评论补充,也欢迎大家斧正

  • 15
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱写代码的小鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值