杭州电子科技大学oj1002

由于这道题的整数相加位数过大,已经不可以使用数据类型来定义了,所以只能一位一位的去相加计算,今天学习到的两个重点地方:

本位数字 =( a + b + 前一位进位 )% 10,进位数字=( a + b + 前一位进位 )/ 10,

下面的解法也是从大神那里学习到的,现保存下来,以免忘记,虚心学习,好脑子不如一个烂笔头

#include<bits/stdc++.h>
using namespace std;

char a[1001],b[1001],c[1001],d[1001];

int main()
{
	int n,s,num=0;
	cin>>n;
	while(n--)
	{
		num++;//用来判断是第几个等式 
		cin>>a>>b;
		int s1=strlen(a);
		int t1=0;
		int s2=strlen(b);
		//将数组a进行反转
		for(int i=s1-1;i>=0;i--)
		{
			c[t1]=a[i];
			++t1;	
		} 
		
		//将数组b进行反转
		t1=0;
		for(int i=s2-1;i>=0;i--)
		{
			d[t1]=b[i];
			++t1;
		}
		//找到两个数字的最大长度,并将位数补成同位
		if(s1>s2)
		{
			s=s1;
			for(int i=s2;i<s1;i++)
			{
				d[i]='0';
			}
		}else{
			s=s2;
			for(int i=s1;i<s2;i++)
			{
				c[i]='0';
			}
		}
		//按照加法法则,本位数字=(数字1+数字2+前一位进位)%10
		int t=0,x1,x2;
		for(int i=0;i<s;i++)
		{
			x1=c[i]-'0';
			x2=d[i]-'0';
			d[i]=(x1+x2+t)%10+'0';
			t=(x1+x2+t)/10;	
		} 
		
		//判断最高位是否有进位
		if(t==0)
		{
			cout<<"Case "<<num<<":"<<endl;
			cout<<a<<" + "<<b<<" = ";
			for(int i=s-1;i>=0;i--)
			{
				cout<<d[i];	
			}	
			
			if(n!=0)
			{
				cout<<endl<<endl;
			}else{
				cout<<endl;
			}
		}else{
			cout<<"Case "<<num<<":"<<endl;
			cout<<a<<" + "<<b<<" = ";
			char c='1';//最高位有进位时,进位值也是1 
			strcat(d,&c);//strcat:将两个char类型连接。
			for(int i=s;i>=0;i--)
			{
				cout<<d[i];
			}
			
			if(n!=0)
			{
				cout<<endl<<endl;
			}else{
				cout<<endl;
			}
		}
	}
	
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值