大数系列——大数减法

来源:互联网 发布:伦敦帝国学院 知乎 编辑:程序博客网 时间:2024/06/06 02:49

会了加法,自然也要会减法,并不是把加号换成减号那么简单,还是要动一番脑筋的。

下面先写上我的代码:

#include<stdio.h>#include<algorithm>char num1[111], num2[111];bool compare(char a[], char b[]){int len1 = strlen(a);int len2 = strlen(b);int i, j;if(len1 > len2)return true;else if(len1 == len2){for(i = 0; i < len1; i++){if(a[i] > b[i])return true;else if(a[i] < b[i])return false;}return true;}elsereturn false;}void reverse(char a[]){int i;int len = strlen(a);int temp;for(i = 0; i < len/2; i++){temp = a[i];a[i] = a[len-1-i];a[len-1-i] = temp;}}void minus(char a[], char b[], char c[]){int len1 = strlen(a);int len2 = strlen(b);int i, j;int L = 0;reverse(a);reverse(b);for(i = len2; i < len1; i++)//这一步很关键,初始化b[i] = '0';for(i = 0; i < len1; i++){if(a[i] + L >= b[i]){c[i] = a[i] + L - b[i] + '0';L = 0;}else{c[i] = (10 - (b[i] - '0')) + a[i] + L;L = -1;}}reverse(c);}using namespace std;int main(){int i, j;while(scanf("%s%s",num1,num2) != EOF){int len1 = strlen(num1);int len2 = strlen(num2);if(compare(num1,num2)){//这里也可以改成strcmp函数对特定情况进行讨论minus(num1, num2, num2);i = 0;while(num2[i] == '0' && i < len1 - 1)//这一步是对应 "a - a = 0"这种情况i++;for( ; i < len1; i++)printf("%c",num2[i]);}else{printf("-");minus(num2, num1, num1);i = 0;while(num1[i] == '0')//这一步是对应"a - b = c < 0, 且 c输出时会有多余的0"的情况,如-001i++;for( ; i < len2; i++)printf("%c",num1[i]);}printf("\n");}return 0;}
以上就是大数的减法。

0 0