信息学奥赛 · 02/20/2023 0

【信息学奥赛】大数据加法

/*************************************
大整数加法
求两个不超过200位的非负数的和
不能存在先导0
***************************************/
#include <iostream>
#include <cstring>
using namespace std;
int main(){
	int a[2000],b[2000],c[2000];
	char ca[2000],cb[2000];
	int x=0; 
//	int存储计算。即数字。char存储输入,x是后面用到的进位计数 
	cin>>ca>>cb;
	cout<<ca<<endl<<cb<<endl;
//	检查一下没有溢出
	int length_a = strlen(ca);
	int length_b = strlen(cb);
	int length_c = 1;
	for(int i=0;i<length_a;i++){
		a[i] = ca[i]-48;
//	减去48是ASCII码数字0的起始位置 
	} 
	for(int i=0;i<length_b;i++){
		b[i] = cb[i]-48;
	}
	while(length_c<=length_a||length_c<=length_b){
//		和分别小于两个数时进行逐位相加 
		c[length_c] = a[length_c-1]+b[length_c-1]+x;
//	这时候其实使用do while 更好。使用while时候因为length_c起始值是1 为了加入循环不能从0开始。故而将ab长度减一 
		x = c[length_c]/10;
		c[length_c] = c[length_c]%10;
		length_c++;	
	}
	c[length_c]=x;
	cout<<length_a<<length_c<<endl; 
//	最后一位进位
	int k=0;
	if(c[length_c]!=0) {
		k= length_c;
	}
	else{
		k = length_c-1;
	} 
//	判断首位是否有进位 
	for(int j=k;j>=1;j--){
		cout<<c[j]; 
	}
//	逐位打印避免显示先导0 
	return 0;
	
}