C++实现两个大数相减

来源:互联网 发布:橱柜哪个牌子好 知乎 编辑:程序博客网 时间:2024/06/03 06:17

  两个大数相减。(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. 输出结果
这里写图片描述
这里写图片描述

0 0
原创粉丝点击