高精度整数加法(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时’+’不出现在输出字符串,结果为负时输出字符串最左边位置为’-‘。

输入

输入两个字符串

输出

输出给求和后的结果

样例输入

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;
}

阅读原文
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值