题目
描述
在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在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时’+’不出现在输出字符串,结果为负时输出字符串最左边位置为’-‘。
输入
输入两个字符串
输出
输出给求和后的结果
样例输入
9876543210
1234567890
样例输出
11111111100
代码
#include <iostream>
#include <string>
#define N 10000
using namespace std;
void Longadd1(string s1,string s2) //两个正数相加的时候
{
int len1=s1.size(),len2=s2.size();
int a[N]= {0},b[N]= {0};
for (int i=0; i<len1; i++)
a[i]=s1[len1-1-i]-'0';
for (int i=0; i<len2; i++)
b[i]=s2[len2-1-i]-'0';
int len=(len1>len2 ? len1:len2);
for (int i=0; i<len; i++)
{
a[i]+=b[i];
if (a[i]>=10)
{
a[i]=a[i]%10;
a[i+1]++;
}
}
if (a[len])
cout<<a[len];
for (int i=len-1; i>=0; i--)
cout<<a[i];
cout<<endl;
}
void minusString(string s1,string s2) //两个位数相同的正数相减而且s1>s2
{
int len1=s1.size(),len2=s2.size(),count=0;;
int a[N]= {0},b[N]= {0};
for (int i=0; i<len1; i++)
a[i]=s1[len1-1-i]-'0';
for (int i=0; i<len2; i++)
b[i]=s2[len2-1-i]-'0';
for (int i=0; i<len1; i++)
{
a[i]-=b[i];
if (a[i]<0)
{
a[i]=10+a[i];
a[i+1]--;
}
}
for (int i=len1-1; i>=0; i--) //记录有几个零
{
if (a[i]!=0)
break;
else
count++;
}
for (int i=len1-1-count; i>=0; i--)
cout<<a[i];
cout<<endl;
}
void Longminus(string s1,string s2) //一正一负相加
{
if (s1[0]=='-') //调整为s2负,s1正
{
string tmp=s2;
s2=s1;
s1=tmp;
}
s2.erase(s2.begin());
int k1=s1.size();
int k2=s2.size();
if(k1>k2)
{
string str(k1-k2,'0');
s2=str+s2;
}
else
{
string str(k2-k1,'0');
s1=str+s1;
}
if (s1==s2) //如果两数相等
cout<<"0"<<endl;
else if(s1>s2) //结果为正
minusString(s1,s2);
else
{
cout<<"-";
minusString(s2,s1);
}
}
int main()
{
string m,n;
getline(cin,m);
getline(cin,n);
if (m[0]!='-'&&n[0]!='-')
Longadd1(m,n);
else if (m[0]=='-'&&n[0]=='-') //两个都为负数时
{
m.erase(m.begin());
n.erase(n.begin());
cout<<"-";
Longadd1(m,n);
}
else //一正一负时
Longminus(m,n);
return 0;
}