您的位置:首页 > 其它

【华为机试】无线OSS-高精度整数加法

2017-08-12 11:26 316 查看
题目描述

在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在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时'+'不出现在输出字符串,结果为负时输出字符串最左边位置为'-'。

输入描述:

输入两个字符串

输出描述:

输出给求和后的结果

示例1

输入

9876543210

1234567890

输出

11111111100

分析:此题需要确定几个点:

1.最终的符号;

2.计算过程中加还是减;

3.去掉符号,大数在前小数在后(除全为正或负情况);

下面是程序,看不懂的有注释。
/*1.根据两数的大小(去掉符号位),调整位置,大数在前,小数在后;
2.根据两数的符号及大小判断计算过程中是加还是减,及最终结果的符号正负;
3.把位少的数高位补0;
4.按位相加减,需保存进位数;*/
#include<iostream>
#include <string>
using namespace std;
inline void addorsub(string s1,string s2){
bool midi,fnal,ischange=false;   //midi判断两数是加还是减,fnal判断最后结果是正还是负,ischange判断是否要交换位置;
if(isdigit(s1[0])&&isdigit(s2[0]))   //全为正;
{midi=true;fnal=true;}
else if(s1[0]=='-'&&s2[0]=='-')   //全为负;
{midi=true;fnal=false;s1.erase(s1.begin());s2.erase(s2.begin());}
else if(isdigit(s1[0])&&s2[0]=='-')  {  //第一个为正,第二个为负;
midi=false;s2.erase(s2.begin());  //去掉符号;
if(s1.size()>s2.size())  fnal=true;
else if(s1.size()<s2.size()) {fnal=false;ischange=true;}
else if(s1>s2) fnal=true;
else if(s1<s2)  {fnal=false;ischange=true;}
else {cout<<0<<endl;return;}
}
else if(s1[0]=='-'&&isdigit(s2[0]))  {  //第一个为负,第二个为正;
midi=false;s1.erase(s1.begin());
if(s1.size()>s2.size())  fnal=false;
else if(s1.size()<s2.size()) {fnal=true;ischange=true;}
else if(s1>s2) fnal=false;
else if(s1<s2)  {fnal=true;ischange=true;}
else {cout<<0<<endl;return ;}
}
string temp;   //交换两数的位置(全正全负的情况没有交换位置);
if(ischange){temp=s1;s1=s2;s2=temp;}

//对s2高位补0;
while(s2.size()!=s1.size())  {
if(s1.size()>s2.size())   s2.insert(s2.begin(),'0');
else s1.insert(s1.begin(),'0');
}
//对两个数做加减运算;
int i=s1.size()-1,c=0;   //c是进位数;
temp="";
while(i>=0){
int cc;
if(midi) {   //两数相加;
cc=s1[i]+s2[i]-'0'-'0'+c;
temp.insert(temp.begin(),cc%10+'0');
c=cc/10;
}
else {    //两数相减;
if(s1[i]+c<s2[i])  {cc=10+s1[i]-s2[i]+c; c=-1;} //cc为1位数;
else  {cc=s1[i]-s2[i]+c;c=0;}
temp.insert(temp.begin(),cc+'0');
}
--i;
}
if(c==1)  temp="1"+temp;    //判断最高位是否有进位;
while(temp[0]=='0')  temp.erase(temp.begin());   //去掉高位上的0;
if(!fnal) temp.insert(temp.begin(),'-');   //结果是否为负数;
cout<<temp<<endl;
}
int main(){
string s1,s2;
while(cin>>s1>>s2)   addorsub(s1,s2);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: