高精度加法(c++)

为什么要用高精度?

在这里插入图片描述
有时我们要进行精度较高的运算时,就要使用高精度来进行运算;
就如例题:

大整数加法
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 21965 通过数: 6345
【题目描述】
求两个不超过200位的非负整数的和。

【输入】
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

【输出】
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

【输入样例】
22222222222222222222
33333333333333333333
【输出样例】
55555555555555555555

两个200位的非负整数!就算以long long类型来进行计算也会溢出!
建议:定义两个int类型的数组,数值的下标至少要200,然后用char类型的数组来读,读了再把读入的char数组转换成int类型,如下是代码实现:

	int i,j,lena,lenb,x;
	int a[205],b[205],c[105];
	char t[205],t1[205];
	scanf("%s %s",t,t1);
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	for(i=0;i<strlen(t);i++)a[strlen(t)-i]=t[i]-48; //将char类型的t数组转换成int类型的a数组,方法:减去0的ascii码值 
	for(i=0;i<strlen(t1);i++)b[strlen(t1)-i]=t1[i]-48;

切记!调用memset函数一定要加 #include<string.h>

当然,你也可以加万能头文件 #include<bits/stdc++.h>

将数组读入处理后,就要计算,在此之前,要清空a数组和b数组;从末尾加起,每当a[i]+b[i]>9就要进位;如下是代码实现:

	lena=strlen(t);
	lenb=strlen(t1);
	i=1;
	while((i<=lena) or (i<=lenb)){
		c[i]=a[i]+b[i]+x;
		x=c[i]/10;
		c[i]%=10;
		i++;
	}

敲重点!!!
不要忘记有前导0的存在!!!
下面是我个人常用的一种方法(蒟蒻一枚):

	bool f=false;
	for(i=N-1;i>=1;i--){
		if(a[i]!=0){
			if(!f)f=true;
			printf("%d",c[i]);
		}
		 else if(f)printf("%d",c[i]);
	}
	if(!f)printf("0");
	printf("\n");

下面是完整的AC程序:

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int N=205;
int main(){
	int i,j,lena,lenb,x=0;
	int a[N+2],b[N+2],c[N+2];
	char t[N+2],t1[N+2];
	scanf("%s %s",t,t1);	
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	for(i=0;i<strlen(t);i++)a[strlen(t)-i]=t[i]-48; //将char类型的t数组转换成int类型的a数组,方法:减去0的ascii码值 
	for(i=0;i<strlen(t1);i++)b[strlen(t1)-i]=t1[i]-48;
	lena=strlen(t);
	lenb=strlen(t1);
	i=1;
	while((i<=lena) or (i<=lenb)){
		c[i]=a[i]+b[i]+x;
		x=c[i]/10;
		c[i]%=10;
		i++;
	}
	//printf("\n");
	c[i]=x;
	bool f=false;
	for(i=N-1;i>=1;i--){
		if(c[i]!=0){
			if(!f)f=true;
			printf("%d",c[i]);
		}
		 else if(f)printf("%d",c[i]);
	}
	if(!f)printf("0");
	printf("\n");
	return 0;
}
posted @ 2019-08-13 00:01  unknown_future  阅读(270)  评论(0编辑  收藏  举报