大数减法
对于大数,必须用数组或字符串储存,此处考虑用字符型数组储存;
定义char A[1000],B[1000],c[1000];
用A[],B[]分别储存减数和被减数,C[]来储存结果;
(1).先确定A,B的位数,举个例子,求A[]的位数:
int a = 0 ; while(A[a] != '\0') a++; a即为A的位数。
(2).比较A,B的位数及A[0]与B[0]的大小来确定A,B的大小。
用大数减小数;
(3).比如A>B,a,b分别代表A,B的位数,用C来接收A - B的相应位数
如: A为: 9 8 5 4 8
B为: 8 7 6 7 4
A与B相应位置的数相减得C为: 1 1 -1 -3 4
(4).接下来检查并处理C中小于零的位置的数字
c[0] = 1,c[1] = 1,c[2] = -1,c[3] = -3,c[4] = 4,
从c[4]开始检查,若某位小于0,则上一位减一,原来小于0的位置加10:
for :i:4--0
if(c[i] < 48){//字符‘0’的ASCII码值为48
c[i-1]--;
c[i] += 10;
}
过程如下:
i==4: c[4] == 4>=0,不作处理;
i==3: c[3] == -3<0: c[2]--;c[3] += 10;c[2]变为-2,c[3]变为7.
i==2: c[2] == -2<0: c[1]--;c[2] += 10;c[1]变为0,c[2]变为8.
i==1: c[1] == 0>=0,不作处理;
i==0: c[0] == 1>=0,不作处理;
故结果为:10874
我的代码如下:
//
#include<iostream>
using namespace std;
#define digit 1000
char * jianfa(char big[],int a,char small[],int b){
char c[digit],*p;
int i,i1,j,a1=a;
a--;
b--;
while(b>=0){
c[a] = big[a] - small[b] + 48;
a--;
b--;
}
while(a>=0){
c[a] = big[a];
a--;
}
for(i=a1-1;i>0;i--){
if(c[i] < 48){/*************Attention****************/
c[i-1]--;
c[i] += 10;
}
}
i = 0;
while(c[i] == 48) i++;
i1 = i;
for(j=0;j<a1-i1;j++){
c[j] = c[i];
i++;
}
c[j] = '\0';
p = c;
return p;
}
int main(){
char a[digit],b[digit],*c;
while(cin>>a>>b){
bool flag = true;//记录正负(默认为正)
int digit_a=-1,digit_b=-1;//记录数的位数
while(a[++digit_a] != '\0');
while(b[++digit_b] != '\0');
if(digit_a<digit_b || (digit_a == digit_b && a[0] < b[0])) flag =
false;
if(flag){//a>b
c = jianfa(a,digit_a,b,digit_b);
cout<<c<<endl;
}
else{//a<=b
c = jianfa(b,digit_b,a,digit_a);
cout<<"-"<<c<<endl;
}
}
return 0;
}