题目描述
在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中,
参与运算的操作数和结果必须在-2^31~2^31-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时'+'不出现在输出字符串,结果为负时输出字符串最左边位置为'-'。
输入描述:
输入两个字符串
输出描述:
输出给求和后的结果
示例1
输入
9876543210
1234567890
输出
11111111100
代码:
//第五十五题 无线OSS-高精度整数加法
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1, str2;
while (cin >> str1 >> str2)
{
string out;
int flag = 0;
int sStr1 = str1.length() - 1;
int sStr2 = str2.length() - 1;
int sMax = sStr1 > sStr2 ? sStr1 : sStr2;
int sMin = sStr1 > sStr2 ? sStr2 : sStr1;
int sMins = sMin;
if ((isdigit(str1[0]) && isdigit(str2[0])) || (str1[0] == '-' && str2[0] == '-'))
{
if (str1[0] == '0' || str2[0] == '0'||(str1[0] == '-'&&str1[1] == '0') || (str2[0] == '-'&&str2[1] == '0'))
continue;
for (; sMin > 0; sMin--, sStr1--, sStr2--)
{
char ctemp = str1[sStr1] + str2[sStr2] - '0' - '0' + flag;
flag = ctemp > 9 ? 1 : 0;
out += ctemp - flag * 10 + '0';
}
if (isdigit(str1[0]))
{
char ctemp = str1[sStr1] + str2[sStr2] - '0' - '0' + flag;
flag = ctemp > 9 ? 1 : 0;
out += ctemp - flag * 10 + '0';
if (sStr1)
for (int i = sStr1 - 1; i >= 0; i--)
{
char ctemp = str1[i] + flag - '0';
flag = ctemp > 9 ? 1 : 0;
out += ctemp - flag * 10 + '0';
}
else if (sStr2)
for (int i = sStr2 - 1; i >= 0; i--)
{
char ctemp = str2[i] + flag - '0';
flag = ctemp > 9 ? 1 : 0;
out += ctemp - flag * 10 + '0';
}
else if (flag)
out += flag + '0';
}
else if (sStr2)
{
for (int i = sStr2; i > 0; i--)
{
char ctemp = str2[i] + flag - '0';
flag = ctemp > 9 ? 1 : 0;
out += ctemp - flag * 10 + '0';
}
out += '-';
}
else if (sStr1)
{
for (int i = sStr1 - 1; i >= 0; i--)
{
char ctemp = str1[i] + flag - '0';
flag = ctemp > 9 ? 1 : 0;
out += ctemp - flag * 10 + '0';
}
out += '-';
}
}
else if(str2[0] == '-')
{
if (sStr2 >str1.length() || (sStr2 == str1.length() && (str2[1]>str1[0])))
{
for (; sMin >= 0; sMin--, sStr1--, sStr2--)
{
char temp;
if (str2[sStr2] >= (str1[sStr1] + flag))
{
temp = str2[sStr2] - str1[sStr1] - flag + '0';
flag = 0;
}
else
{
temp = str2[sStr2] - str1[sStr1] - flag + 10 + '0';
flag = 1;
}
out += temp;
}
for (; sStr2 >= 0; sStr2--)
out += str2[sStr2];
}
else
{
for (; sMin >= 0; sMin--, sStr1--, sStr2--)
{
char temp;
if (str1[sStr1] >= (str2[sStr1] + flag))
{
temp = str1[sStr1] - str2[sStr2] - flag + '0';
flag = 0;
}
else
{
temp = str1[sStr1] - str2[sStr2] - flag + 10 + '0';
flag = 1;
}
out += temp;
}
for (; sStr1 >= 0; sStr1--)
out += str1[sStr1];
}
}
else
{
if (sStr1 >str2.length() || (sStr1 == str2.length() && (str1[1]>str1[0])))
{
for (; sMin >= 0; sMin--, sStr1--, sStr2--)
{
char temp;
if (str1[sStr1] >= (str2[sStr2] + flag))
{
temp = str1[sStr1] - str2[sStr2] - flag + '0';
flag = 0;
}
else
{
temp = str1[sStr1] - str2[sStr2] - flag + 10 + '0';
flag = 1;
}
out += temp;
}
for (; sStr1 >= 0; sStr1--)
out += str1[sStr1];
}
else
{
for (; sMin > 0; sMin--, sStr1--, sStr2--)
{
char temp;
if (str2[sStr2] >= (str1[sStr1] + flag))
{
temp = str2[sStr2] - str1[sStr1] - flag + '0';
flag = 0;
}
else
{
temp = str2[sStr2] - str1[sStr1] - flag + 10 + '0';
flag = 1;
}
out += temp;
}
for (; sStr2 >= 0; sStr2--)
out += str2[sStr2];
}
}
int iOut = out.size() - 1;//输出数据
for (; iOut >= 0; iOut--)
cout << out[iOut];
cout << endl;
}
return 0;
}
代码二:借用
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
string str1, str2;
while (cin >> str1 >> str2)
{
int len1 = str1.size();
int len2 = str2.size();
if (len1 != len2)
{
if (str1[0] == '-'&&str2[0] == '-')
{
while (str1.size()<str2.size())
{
str1.insert(1, 1, '0');
}
while (str2.size()<str1.size())
{
str2.insert(1, 1, '0');
}
}
else
{
while (str1.size()<str2.size())
{
str1.insert(0, 1, '0');
}
while (str2.size()<str1.size())
{
str2.insert(0, 1, '0');
}
}
}
string s;
int c = 0;
if (str1[0] != '-'&&str2[0] != '-')
{
for (int i = str1.size() - 1; i >= 0; i--)
{
int tmp = str1[i] - '0' + str2[i] - '0' + c;
if (tmp>9)
{
tmp = tmp - 10;
c = 1;
}
else
{
c = 0;
}
s += to_string(tmp);
}
if (c == 1)
{
s += '1';
}
reverse(s.begin(), s.end());
}
if (str1[0] == '-'&&str2[0] == '-')
{
for (int i = str1.size() - 1; i>0; i--)
{
int tmp = str1[i] - '0' + str2[i] - '0' + c;
if (tmp>9)
{
tmp = tmp - 10;
c = 1;
}
else
{
c = 0;
}
s += to_string(tmp);
}
if (c == 1)
{
s += '1';
}
s += '-';
reverse(s.begin(), s.end());
}
cout << s << endl;
}
return 0;
}