您的位置:首页 > 编程语言 > C语言/C++

C++实现两个大数相减

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

比较两个字符串的大下

  比较两个字符创的大小,首先看两个字符串的长度,长度越长,显然数据越大;其次如果长度相同,则从头到尾顺次比价对应位置的字符的大下。具体实现如下:

/大于或者等于返回为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
;
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. 输出结果



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法