p16301A+B,高精度求和

题目描述

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

输入格式

分两行输入。a,b≤10500a,b≤10500。

输出格式

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

输入输出样例

输入 #1

1
1

输出 #1

2

输入 #2

1001
9099

输出 #2

10100

题目分析:

        由于数字的位数最大时500位,这时即使longlong也无法存储这样的数字,所以,我们需要使用高精度去解决它。

        1.用字符串数%s将数字读入字符串数组

                ①为什么要用字符串数组?

                        因为你并不知道两个数字的最大位数是几,进行求和的时候会导致越界

                         其实可以使用int,但是就数据的输入,char更方便,下一步进行个位对齐,就比较方便

        2.个位对齐:

                小学我们都知道,列竖式就要对齐,进行运算,大于等于10就进位,这是,我们可以把个位放在数组开始的地方,把高位放在数组末尾,实现下面这样的效果:(当然这是一个思路,你只要实现每一位对齐就行)

        3.求和运算:

                进行求和的时候,要考虑,这最终求和之后的数字是个几位数?由于这是求和,最多就只是比原来最多的位数多一位,所有我们可以在求和完成后进行一次专门针对位数的判断,也就是对最高位的下一个数组元素判断是否大于零,如果大于零,输出的时候就得多输出一位。

        实现求和,将对应位的两个数字加起来,然后判断是否大于等于10,如果大于,那么给下一位+1,如果不大于,就直接给用来输出最终答案的数组对应位置+1,最后逆着输出就行了

代码:

#include <stdio.h>
#include <string.h>
int num1[501],num2[501],num[501];
char arr1[501],arr2[501];
int max(int x,int y) {
	if(x>y) {
		return x;
	} else {
		return y;
	}
}
int main() {
	scanf("%s",arr1);
	scanf("%s",arr2);
	int len1=strlen(arr1);
	int len2=strlen(arr2);
	int len=max(len1,len2);
	for(int i=0; i<len; i++) {
		num1[i]=0;
		num2[i]=0;
	}
	for(int i=0,t=len1-1; i<len1; i++,t--) { //将每一项进行转化
		num1[t]=arr1[i]-48;
	}
	for(int i=0,t=len2-1; i<len2; i++,t--) {
		num2[t]=arr2[i]-48;
	}
	int sum=0;
	for(int i=0; i<len; i++) { //进行模拟求和
		sum=num1[i]+num2[i];
		if(sum>9) {
			num[i]=sum%10;
			num1[i+1]++;
			sum=0;
		} else {
			num[i]=sum;
			sum=0;
		}
	}
	if(num1[len]>0) { 	//对首位进行判断
		num[len]++;
		for(int i=len; i>=0; i--) {
			printf("%d",num[i]);
		}
	} else {
		for(int i=len-1; i>=0; i--) {
			printf("%d",num[i]);
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值