示例:
99999999999999999999(20位) - 11111111111111111111(20位) = 88888888888888888888(20位)
思想:由于int型一般最大不超过10亿左右,所以当数据太大的时候,会给计算带来问题。从而需要引入大数减法。
这里的大数减法,是基于数组操作的。将数据的每一位分别储存在一个数组里面,然后模拟减法运算。
需要注意的就是当被减数小于减数的时候,借位操作。
/*
Title:大数减法
Author:Dojking
*/
#include <iostream>
#include <string>
using namespace std;
void swap(string &sub1, string &sub2) /*交换两数*/
{
string t;
t = sub1;
sub1 = sub2;
sub2 = t;
}
void BigSub(string sub1, string sub2) /*大数减法*/
{
int i,j,num,len1,len2;
len1 = sub1.size()-1;
len2 = sub2.size()-1;
int *strsub = new int[len1+2]; /*动态开辟空间*/
for (i = 0; i <= len1+1; ++i)
strsub[i] = 0; /*初始化为0*/
for (i = len1, j = len2; i >= 0; --i,--j)/*sub1位数不小于sub2位数*/
{
if (j >= 0)
num = (sub1[i]-'0')+strsub[i+1] - (sub2[j]-'0'); /*差*/
else
num = (sub1[i]-'0')+strsub[i+1]; /*差*/
if (num < 0)
{
strsub[i+1] = (num+10); /*本位*/
strsub[i] = -1; /*高位:借1*/
}
else
{
strsub[i+1] = num; /*本位*/
}
}
i = 0;
while (strsub[i] == 0) /*舍去高位无用0*/
++i;
for ( ; i <= len1+1; ++i) /*打印结果*/
cout<<strsub[i];
cout<<endl;
delete[] strsub;
strsub = NULL;
}
int main()
{
string sub1,sub2;
cin>>sub1>>sub2;
if (sub1.size() < sub2.size() || sub1.size() == sub2.size() && sub1 < sub2) /*使sub1>sub2*/
{
swap(sub1,sub2);
cout<<"-"; /*打印负号*/
}
BigSub(sub1,sub2); /*大数减法*/
return 0;
}