无线OSS-高精度整数加法/华为机试(C/C++)

题目描述

在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值