大整数减法
来源:互联网 发布:c语言文件后缀 编辑:程序博客网 时间:2024/04/29 17:39
#include <iostream>#include <cstring>using namespace std;const int MAXLEN = 200;//大整数减法int Substract(int MaxLen, int *a1, int *a2){ int nHighestPos = 0; for(int i = 0; i < MaxLen; ++i) { a1[i] -= a2[i]; if(a1[i] < 0)//判断是否需要借位 { a1[i] += 10; a1[i + 1]--; } if(a1[i] > 0) nHighestPos = i; } return nHighestPos;}//求最大值int Max(int x, int y){ return ((x > y) ? x : y);}int main(){ //标志应该谁是被减数,从而确定顺序 int n;//要输入的组数 cin >> n; while(n--) { char *s1 = new char[MAXLEN + 10]();//每次循环开始动态分配,结束动态释放内存,可以防止加减交替运算时造成的内存错误 char *s2 = new char[MAXLEN + 10](); int *a1 = new int[MAXLEN + 10](); int *a2 = new int[MAXLEN + 10](); int Flag = 0; cin >> s1; cin >> s2; int nLen1 = strlen(s1); for(int i = nLen1 - 1, j = 0; 0 <= i; --i) { a1[j++] = s1[i] - '0'; } int nLen2 = strlen(s2); for(int i = nLen2 - 1, j = 0; 0 <= i; --i) { a2[j++] = s2[i] - '0'; } int MaxLen = Max(nLen1, nLen2); // if(nLen1 == nLen2) { for(int i = 0; i < nLen1; ++i) { if(s1[i] > s2[i]) { Flag = 1; break; }else if(s2[i] > s1[i]) { Flag = 2; break; } } } // if(Flag == 1 || nLen1 > nLen2) { int Pos = Substract(MaxLen, a1, a2); for(int i = Pos; 0 <= i; --i) cout << a1[i]; cout << endl; }else if(Flag == 2 || nLen2 > nLen1) { int Pos = Substract(MaxLen, a2, a1); for(int i = Pos; 0 <= i; --i) { if(i == Pos) cout << -a2[i]; else cout << a2[i]; } cout << endl; }else cout << 0 << endl; delete [] s1; delete [] s2; delete [] a1; delete [] a2; } return 0;}