大数加法AC代码

题目:我有一个非常简单的问题给你。给定两个整数 A 和 B,您的工作是计算 A + B 的总和。

输入

输入的第一行包含整数 T(1<=T<=20),这意味着测试案例的数量。然后T行跟随,每行由两个正整数,A和B组成。 请注意,整数非常大,这意味着您不应该使用32位整数处理它们。您可以假设每个整数的长度不会超过 1000。

输出

对于每个测试案例,您应该输出两行。第一行是"案例":",#表示测试案例的数量。第二行是方程"A + B = Sum",Sum 表示 A + B 的结果。 请注意,方程中有一些空格。在两个测试案例之间输出一条空白线。

示例输入

2
1 2
112233445566778899 998877665544332211

样品输出

Case 1:
1 + 2 = 3

Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110

思路:由于整数长度最大可到1000,需要使用数组才存储。在使用竖式进行加法运算时,要从个位数开始加起,所以我们要把大整数逆序存储在数组中。两个数对应位相加后大于10便要把该数减10并对高位加1(逢十进一)

代码:

#include <iostream>
#include <string.h>
using namespace std; 

int main()
{
	char a[1000],b[1000];
	int a_int[1001],b_int[1001];
	int t,a_len,b_len,max_len;
	cin>>t;
	for(int i=1;i<=t;i++)
	{
		cin>>a>>b;
		a_len = strlen(a); 
		b_len = strlen(b);//求两个数的长度 
		
		//将两个数倒置存入新数组 
		int tmp=0;
		for(int j=a_len-1;j>=0;j--) 
		{
			a_int[tmp++]=a[j]-'0';//将字符改为数字 
		}
		
		tmp=0;
		for(int k=b_len-1;k>=0;k--) 
		{
			b_int[tmp++]=b[k]-'0';
		}
		
		//使两个数组长度相同,用0补齐,且比原长度加一 
		if(a_len>b_len)
		{
			for(int j=b_len;j<=a_len;j++)
			{
				b_int[j]=0;
			}
			a_int[a_len]=0;
		}
		else if(a_len<b_len)
		{
			for(int j=a_len;j<=b_len;j++)
			{
				a_int[j]=0;
			}
			b_int[b_len]=0;
		}
		else
		{
			a_int[a_len]=0;
			b_int[b_len]=0;
		}
		
		max_len=(a_len>=b_len)? a_len:b_len;
		for(int j=0;j<=max_len;j++)
		{
			a_int[j]+=b_int[j];
			if(a_int[j]>=10)
			{
				a_int[j]-=10;//满10进1 
				a_int[j+1]+=1;
			}
		}
		cout<<"Case "<<i<<":"<<endl;
		cout<<a<<" "<<"+"<<" "<<b<<" "<<"="<<" ";
		if(a_int[max_len]==0)//最高位为0,抛弃最高位倒叙输出 
		{
			for(int j=max_len-1;j>=0;j--)
			cout<<a_int[j];
		}
		else//最高位不为0直接倒叙输出 
		{
			for(int j=max_len;j>=0;j--)
			cout<<a_int[j];
		}
		if(i!=t)
		cout<<endl<<endl;
		else
		cout<<endl;
	}
	
	return 0;
}

上一篇:AtCoder Beginner Contest 174 题解


下一篇:AcWing 810. 绝对值