杭电 1002 A+B 不懂你打我

A + B问题II

 

问题描述

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

输入

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

输出

对于每个测试用例,您应输出两行。第一行是“案例#:”,#表示测试用例的编号。第二行是方程“A + B = Sum”,Sum表示A + B的结果。注意方程中有一些空格。在两个测试用例之间输出一个空行。

样本输入

2

1 2

112233445566778899 998877665544332211

样本输出

情况1:

1 + 2 = 3

 

案例2:

112233445566778899 + 998877665544332211 = 1111111111111111110

 

 

思路:

既然无法直接用int,long int等直接定义求解出题目,所以我们用字符串解决问题。

由于反向存储可以使得我们在进行两个数相加或相乘的时候可以顺着来,即从数组下标0开始往下,

举个例子:89 + 89

如果我们不反向,直接将其存储在整数数组,那么 

    89

+ 89

----

 1 78得到178             但这就以为着我们是从后往前加的,这提升了复杂性,我们可以从前往后加,方便思考

反向加:

    98

+ 98

----

    87 1得到178 

如果不理解上述过程 可以看另一篇博文:https://blog.csdn.net/szlg510027010/article/details/84325598

我们是从后往前加,但我们读数的时候是从前往往加的,为了更方便思考,所以我们可以反向加,进位是往后进位的

所以我们将字符数组存放到数字数组的时候可以反向存储

之后进行反向加,再进行反向打印即可。

AC代码:

 

#include <iostream>
#include <string.h> 
using namespace std;
int main()
{
	char a[1000],b[1000];//用于存放大数 
	int a_int[1001],b_int[1001];//用于将大数转化为整数
	int n,a_len,b_len,max_len;
	//n为case次数
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		//输入两个数 
		cin>>a>>b; 
		a_len = strlen(a);//大数 a 的长度 
		b_len = strlen(b);//大数 b 的长度 
		
		int tmp = 0;
		
		//将字符串数组反向存入整形数组,
		//a_int[0] 存放的是字符数组的个位数
		//字符数组最后一位是 '\0' 要减去 
		for(int j=a_len-1;j>=0;j--)
			a_int[tmp++] = a[j] - '0';	
		
		tmp = 0;
		
		for(int j=b_len-1;j>=0;j--)
			b_int[tmp++] = b[j] - '0';
		
		//将两个数组的位数填充至相等的状态,并且增多一位,
		//目的是如果后面有进位,则方便运算
		
		//如果位数是相等的,则同时进位即可 
		if(a_len==b_len)
		{
			a_int[a_len] = 0;
			b_int[b_len] = 0;			
		}
		//如果位数不等,则补位后再进位	
		else 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(b_len>a_len)
		{
			//补位 + 进位 
			for(int j=a_len;j<=b_len;j++)
				a_int[j] = 0;	
			b_int[b_len] = 0;//进位 
		}
		
		/求和,解过保存到a_int里面
		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;
				a_int[j+1]+=1;
			}
		}
		cout<<"Case "<<i<<":"<<endl;
        cout<<a<<" + "<<b<<" = ";	
		
		//判断最高位是否有进位,有就输出
		
		//最高位没有进位,不用输出 
		if(a_int[max_len]==0)
		{
			for(int j=max_len-1;j>=0;j--)
				cout<<a_int[j];
		}
		
		//最高位有进位,输出 
		else
		{
			for(int j=max_len;j>=0;j--)
				cout<<a_int[j];	
		}
		
		//如果不是最后一个案例就换行 + 空行 
		if(i!=n)
            cout<<endl<<endl;
        else
            cout<<endl;	
	}	 
} 

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值