欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

高精度加法

程序员文章站 2022-07-14 23:37:16
...

背景:
我们为什么要研究高精度加法?
因为普通的变量存不下我们的计算结果,也存不下我们的加数和被加数

思路:
我们如何做呢?来一起分析一下
我们知道我们人类手工计算大数相加时我们也不可能直接计算出来,我们是先将两个数写下来,在逐位相加,最后得到相加的结果,
既然计算机模仿人,那么我们可以用数组存储每位数字
然后…写不下去了,直接上代码233,代码很详细

#include<iostream>
#include<cstring>
#define size 9999

using namespace std;
//1.存储大数
//2.大数相加
//3.输出结果
int main() {

	int t;
	cin>>t;
	while(t--) {
		//存储大数
		int a[size]= {0},b[size]= {0},c[size]= {0};
		string A,B;
		cin>>A;
		cin>>B;
		int len_a=A.length(),len_b=B.length();
		//将字符串A中存放的字符转为数字逆序存储在a数组中,
		for(int i=0; i<len_a; i++) {
			a[i]=(A[(len_a-1)-i]-'0');
		}
		//B->b[]
		for(int i=0; i<len_b; i++) {
			b[i]=(B[(len_b-1)-i]-'0');
		}
		//相加操作
		//判断结果的长度
		int len_c=(len_a>len_b)?len_a:len_b;

		int p,flag=0;
		for(int i=0; i<len_c; i++) {
			p=a[i]+b[i]+flag;
			if(i==len_c-1&&p>=10)//如果结果的最高位>=10则,len_c+1
				len_c+=1;

			if(p>=10) {
				c[i]=p%10;
				flag=1;//保存进位
			} else {
				flag=0;
				c[i]=p;
			}
		}
		//逆序输出结果
		for(int i=len_c-1; i>=0; i--) {//将len_c的长度需要判断更加严格,将00222等的结果的零除去,就是如果结果开头为零,就将开头的零除去 
			if(c[i]==0&&c[i-1]==0||c[i]==0&&c[i-1]!=0) {
				len_c--;
			}
			if(c[i]!=0) {
				break;
			}
		}
		for(int i=len_c-1; i>=0; i--) {//逆序输出结果 
			cout<<c[i];
		}
		cout<<endl;
	}

	return 0;
}
相关标签: 算法基础