华为OJ(高精度整数加法)

描述

在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中,
参与运算的操作数和结果必须在-231~231-1之间。如果需要进行更大范围的十进制整数加法,需要使用特殊
的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。如下:
9876543210 + 1234567890 = ?
让字符串 num1="9876543210",字符串 num2="1234567890",结果保存在字符串 result = "11111111100"。
-9876543210 + (-1234567890) = ?
让字符串 num1="-9876543210",字符串 num2="-1234567890",结果保存在字符串 result = "-11111111100"。

 


要求编程实现上述高精度的十进制加法。
要求实现方法: 
public String add (String num1, String num2)
【输入】num1:字符串形式操作数1,如果操作数为负,则num1的前缀为符号位'-'
num2:字符串形式操作数2,如果操作数为负,则num2的前缀为符号位'-'
【返回】保存加法计算结果字符串,如果结果为负,则字符串的前缀为'-'
注:
(1)当输入为正数时,'+'不会出现在输入字符串中;当输入为负数时,'-'会出现在输入字符串中,且一定在输入字符串最左边位置;
(2)输入字符串所有位均代表有效数字,即不存在由'0'开始的输入字符串,比如"0012", "-0012"不会出现;
(3)要求输出字符串所有位均为有效数字,结果为正或0时'+'不出现在输出字符串,结果为负时输出字符串最左边位置为'-'。

 

 

知识点 字符串
运行时间限制 10M
内存限制 128
输入

输入两个字符串

输出

输出给求和后的结果

样例输入 9876543210 1234567890
样例输出 11111111100
先解决两个字符串表示的超长整数相加、相减的问题,之后根据符号位调用即可,事实证明再次眼高手低了,o(╯□╰)o,就连减法竟然都忘记了,真有必要用笔写写再敲。

#include<iostream>
#include<string>
using namespace std;
string add(string,string);
string subtract(string,string);
int main(void)
{	
	string s1,s2;
	cin>>s1>>s2;
	if(s1[0]=='-'&&s2[0]!='-'||s1[0]!='-'&&s2[0]=='-')//有一个减号的情况
		cout<<subtract(s1,s2);
	else if(s1[0]=='-'&&s2[0]=='-')//两个数都有减号的情况,先把减号去掉,利用加法最后加上负号即可
	{
		s1=s1.substr(1,s1.size()-1);
		s2=s2.substr(1,s2.size()-1);
		cout<<"-"+add(s1,s2);
	}
	else							//两个数都没有减号的情况
		cout<<add(s1,s2);
	//system("pause");
	return 0;
}
string add(string s1,string s2)
{
	string s3;
	int len_short,len_long;
	if(s1.size()>s2.size())
	{
		len_short=s2.size();
		len_long=s1.size();
		s3=s1;
	}
	else
	{
		len_short=s1.size();
		len_long=s2.size();
		s3=s2;
	}
	int flag=0;
	int tmp;
	for(int i=1;i<=len_short;i++)
	{
		tmp=s1[s1.size()-i]-'0'+s2[s2.size()-i]-'0'+flag;
		if(tmp>9)
		{
			s3[s3.size()-i]=tmp-10+'0';
			flag=1;
		}
		else
		{
			s3[s3.size()-i]=tmp+'0';
			flag=0;
		}
	}
	
	for(int i=0;i<s3.size()-len_short;i++)
	{
		tmp=s3[i]-'0'+flag;
		if(tmp>9)
		{
			s3[i]=tmp-10+'0';
			flag=1;
		}
		else
			flag=0;
	}
	if(flag==1)
		s3="1"+s3;
	return s3;
}
		
string subtract(string s1,string s2)
{
	string sshort,slong,neg;//分别为较长整数、较短整数。如果是长整数-短整数,直接得出结果,如果是短整数-长整数,结果加负号,neg保存是否需要负号
	if(s1[0]=='-')
	{
		s1=s1.substr(1,s1.size()-1);
		if(s1.size()==s2.size())
		{
			for(int i=0;i<s2.size();i++)
				if(s1[i]>s2[i])
					{
						neg="-";
						break;
					}
		}
		else if(s1.size()>s2.size())			
				neg="-";
		if(neg=="-")
		{
			slong=s1;
			sshort=s2;
		}
		else
		{
			slong=s2;
			sshort=s1;
		}

	}
	else if(s2[0]=='-')
	{
		s2=s2.substr(1,s2.size()-1);
		if(s1.size()==s2.size())
		{
			for(int i=0;i<s2.size();i++)
				if(s2[i]>s1[i])
					{
						neg="-";
						break;
					}
		}
		else if(s2.size()>s1.size())		
			neg="-";
		if(neg=="-")
		{
			slong=s2;
			sshort=s1;
		}
		else
		{
			slong=s1;
			sshort=s2;
		}
	}		
	int flag=0;
	int tmp;
	for(int i=1;i<=sshort.size();i++)
	{
		tmp=slong[slong.size()-i]-sshort[sshort.size()-i]-flag;
		if(tmp<0)
		{
			slong[slong.size()-i]=tmp+10+'0';
			flag=1;
		}
		else
		{
			slong[slong.size()-i]=tmp+'0';
			flag=0;
		}
	}
	
	for(int i=0;i<slong.size()-sshort.size();i++)
	{
		tmp=slong[i]-'0'-flag;
		if(tmp<0)
		{
			slong[i]=tmp+10+'0';
			flag=1;
		}
		else
			flag=0;
	}
	if(slong.size()!=1)
		{
			int pos=slong.find_first_not_of('0',0);//对于结果中前面有0的,比如88-89,经过上面的计算为01,下面是将0去掉。
			if(pos!=-1)
			slong=slong.substr(pos,slong.size()-pos);
			else
			slong="0";
		}
	if(flag==1&&neg!="-"||flag!=1&&neg=="-")
		slong="-"+slong;	
	return slong;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值