C++实现两个大数相减

  两个大数相减。(1)首先是数据输入的问题,采用字符创输入的形式;(2)其次需要比较两个数据的大小,两个数相减会有正负号的问题,若a>b,则有a-b=-(b-a),计算出b-a的值,然后在字符串的前面加上"-"即可,转换成大数减去小数的问题;(3)最后需要考虑的问题也是最核心的问题,两个数相减的过程。从两个数的末位开始,这涉及到借位的问题,字符向数字转化,数字向字符转化的问题等。下面来看它们的具体实现。

  1. 比较两个字符串的大下
      比较两个字符创的大小,首先看两个字符串的长度,长度越长,显然数据越大;其次如果长度相同,则从头到尾顺次比价对应位置的字符的大下。具体实现如下:
/大于或者等于返回为true,小于返回为false/
bool isGreat(string chara, string charb)
{
    int lena = chara.length();
    int lenb = charb.length();
    if (lena > lenb)
        return true;
    else if (lena < lenb)
        return false;
    else
    {
        int n = lena;
        int i = 0;
        for (; i < n; i++)
        {
            if (chara[i]>charb[i])
                return true;
            else if (chara[i] < charb[i])
                return false;
        }
        if ((i == n) && chara[i - 1] == charb[i - 1])
            return true;
    }
    return false;
}

2. 两个数相减的实现
  两个数相减,主要涉及到借位和数字和字符的转化的问题,然后相减是分别从两个大数的末端开始的。具体的实现如下。

void differValue(string astr, string bstr,char* cstr)
{
    int overflow = 0;  //借位标志,有借位时设置值为-1
    int i, j;
    for ( i = (astr.length()-1),j=bstr.length()-1; i >=0,j>=0; i--,j--)
    {
        if ((astr[i] + overflow) < bstr[j])
        {
            cstr[i] = (astr[i] - '0') + overflow + 10 - (bstr[j] - '0')+'0';
            overflow = -1;
        }
        else
        {
            cstr[i] = (astr[i] - '0')  - (bstr[j] - '0')+'0';
            overflow = 0;
        }
    }
    while (i>=0)  //只剩下一个数的时候
    {
        if ((astr[i]-'0' + overflow)<0)
        {
            cstr[i] = astr[i] + overflow + 10;
            overflow = -1;
        }
        else
        {
            cstr[i] = astr[i];
        }
        i--;
    }

}

3. 最后输入输出问题
  输入的两个大数据采用,采用字符创的形式,开始不知道最后的结果的大下,最后的结果存放在new开辟的堆内存中,具体实现如下:

int main()
{
    string stra,strb;
    cin >> stra >> strb;
    int n = stra.length() > strb.length() ? stra.length() : strb.length();
    char* result=new char[n] ;
    memset(result, -1, n);

    if (isGreat(stra, strb))
    {
        differValue(stra, strb, result);
    }
    else
    {
      //结果字符串的 第一位作为符号位,如果结果为负,应该存放"-"
        result[0] = '-';
        differValue(strb, stra, result+1);
    }

    for (unsigned int j = 0; j<strlen(result); j++)
    {
        if (result[j] != '-1') //最后输出的时候,忽略字符为空的情况
        {
            cout << result[j];
        }
    }
  delete[] result;
    
}

4. 输出结果
这里写图片描述
这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值