大数加减法(面试准备)

大数加减法,使用string类型来表示数字

//思路:

1):对于两个正数或者是负数相加,则直接相加

2):负数加上正数,则相当于正数减去负数

代码如下:

/**
大整数的加减法
*/
#include <iostream>
#include <string>
using namespace std;
int myminus=0;//0 表示没有负号,1表示有
string bignumdel(string str1,string str2);
string bignumAdd(string str1,string str2)
{

	int len1=str1.length();
	int len2=str2.length();
	if(len1==0)
		return str2;
	if(len2==0)
		return str1;
	if(str1[0]=='-' && str2[0]=='-')
	{
		myminus=1;
		str1.erase(0,1);str2.erase(0,1);
		return bignumAdd(str1,str2);
	}
	else if(str1[0]=='-' && str2[0]!='-')
	{
		str1.erase(0,1);
		return bignumdel(str2,str1);
	}
	else if(str1[0]!='-' && str2[0]=='-')
	{
		str2.erase(0,1);
		return bignumdel(str1,str2);
	}
	//add
	int maxlen=len1;
	string result;
	if(len1>len2)
	{
		maxlen=len1;
		for(int i=0;i<(len1-len2);i++)
		{
			str2='0'+str2;
		}
	}
	else if(len2>len1)
	{
		maxlen=len2;
		for(int i=0;i<(len2-len1);i++)
		{
			str1='0'+str1;
		}
	}
	int takeover=0;
	for(int i=maxlen-1;i>=0;i--)
	{
		int tmp=(str1[i]-'0')+(str2[i]-'0')+takeover;
		takeover=0;
		if(tmp>=10)
		{
			tmp=tmp%10;
			takeover=1;
		}
		char ch=('0'+tmp);
		result= ch +result;
	}
	if(takeover==1)
		result='1'+result;
	return result;
}
string bignumdel(string str1,string str2)
{
	int len1=str1.length();
	int len2=str2.length();
	if(len1>len2)
	{
		for(int i=0;i<len1-len2;i++)
			str2='0'+str2;
	}
	else if(len2>len1)
	{
		for(int i=0;i<len2-len1;i++)
			str1='0'+str1;
		myminus=1;
		return bignumdel(str2,str1);
	}
	else if(len1==len2)
	{
		if(str1<str2)
		{
			myminus=1;
			return bignumdel(str2,str1);
		}   
	}
	//del
	int takeover=0;
	string result;
	for(int i=len1-1;i>=0;i--)
	{
		int tmp=(str1[i]-'0')-(str2[i]-'0')-takeover;
		if(tmp<0)
		{
			tmp=(str1[i]-'0')-(str2[i]-'0')+10-takeover;
			takeover=1;
		}
		char ch='0'+tmp;
		result= ch +result;
	}
	return result;
}
int main()
{
	string str1,str2;
	while(cin>>str1>>str2)
	{
		string res=bignumAdd(str1,str2);
		if(myminus==1)
			printf("-");
		int len=res.length();
		int i=0;
		while((i++)<len)//除0前缀
		{
			if(res[0]=='0')
			{
				res.erase(0,1);
			}
			else break;
		}
		cout<<res<<endl;
		myminus=0;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值