字符串加法

题目描述

给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开。 现在请计算A+B的结果,并以正常形式输出。

输入描述:

输入包含多组数据数据,每组数据占一行,由两个整数A和B组成(-10^9 < A,B < 10^9)。

输出描述:

请计算A+B的结果,并以正常形式输出,每组数据占一行。

示例1

输入

复制

-234,567,890 123,456,789
1,234 2,345,678

输出

复制

-111111101
2346912

这种题有点麻烦,要分情况考虑。总的运算只有加法和减法两种,但是因为数可以有负号,所以又分为负数+正数(负数绝对值大或正数绝对值大),正数加正数,负数加负数。

#include <iostream>
#include <string.h>
using namespace std;
int res[102];
//加法,这里的运算都是不带负号的 
void add(char *a,char *b){
	int len1=strlen(a);
	int len2=strlen(b);
	int p=len1-1;
	int q=len2-1;
	int c=0;
	int k=0;
	while(p>=0&&q>=0){
		if(a[p]==','){
			p--;
		} 
		if(b[q]==','){
			q--;
		}
		int temp=(a[p]-48)+(b[q]-48)+c;
		c=0;
		if(temp>9){
			res[k]=temp%10;
			k++;
			c=temp/10;
		}
		else{
			res[k]=temp;
			k++;
		}
		p--;
		q--;
	}
	while(p>=0){
		if(a[p]==','){
			p--;
		}
		int temp=a[p]-48+c;
		c=0;
		if(temp>9){
			res[k]=temp%10;
			k++;
			c=temp/10;
		}
		else{
			res[k]=temp;
			k++;
		}
		p--;
	}
	while(q>=0){
		if(b[q]==','){
			q--;
		}
		int temp=b[q]-48+c;
		c=0;
		if(temp>9){
			res[k]=temp%10;
			k++;
			c=temp/10;
		}
		else{
			res[k]=temp;
			k++;
		}
		q--;
	}
	if(c!=0){
		res[k]=c;
		k++;
	}
	for(int i=k-1;i>=0;i--){
		cout<<res[i];
	}
	cout<<endl;
}
//减法,大数在前,小数在后,都是不带负号的 
void sub(char *a,char *b){
	int len1=strlen(a);
	int len2=strlen(b);
	int p=len1-1;
	int q=len2-1;
	int numa[102];
	int numb[102];
	int k=0;
	int r=0;
	while(r<len1){
		if(a[r]==','){
			r++;
		}
		numa[k]=a[r]-48;
		k++;
		r++;
	}
	p=k-1;
	k=0;
	r=0;
	while(r<len2){
		if(b[r]==','){
			r++;
		}
		numb[k]=b[r]-48;
		k++;
		r++;
	}
	q=k-1;
	k=0;
	while(p>=0&&q>=0){
		if(numa[p]>=numb[q]){
			res[k]=numa[p]-numb[q];
			k++;
		}
		else{
			if(numa[p-1]>0){
				numa[p-1]-=1;
				res[k]=numa[p]+10-numb[q];
				k++;
			}
			else{
				int pp=p-1;
				while(numa[pp]==0){
					numa[pp]+=9;
					pp--;
				}
				numa[pp]--;
				res[k]=numa[p]+10-numb[q];
				k++;
			}
		}
		p--;
		q--;
	}
	while(p>=0){
		res[k]=numa[p];
		k++;
		p--;
	}
	int temp=k-1;
	while(res[temp]==0){
		temp--;
	}
	for(int i=temp;i>=0;i--){
		cout<<res[i];
	}
	cout<<endl;
}
//比较两个数绝对值大小,用以确定减法运算参数顺序 
bool cmp(char *a,char *b){
	int len1=strlen(a);
	int len2=strlen(b);
	if(len1>len2){
		return true;
	}
	else if(len1<len2){
		return false;
	}
	else{
		if(strcmp(a,b)>=0)return true;
		else{
			return false;
		}
	}
}
int main(){
	char a[102];
	char b[102];
	while(cin>>a>>b){
		if(a[0]!='-'&&b[0]!='-'){
			add(a,b);
		}
		else if(a[0]=='-'&&b[0]!='-'){
			if(cmp(a+1,b)){
				cout<<"-";
				sub(a+1,b); 
			}
			else{
				sub(b,a+1);
			}
		}
		else if(a[0]!='-'&&b[0]=='-'){
			if(cmp(b+1,a)){
				cout<<"-";
				sub(b+1,a); 
			}
			else{
				sub(a,b+1);
			}
		}
		else{
			cout<<"-";
			add(a+1,b+1);
		}
	}
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值