大数减法思想

 大数减法

    对于大数,必须用数组或字符串储存,此处考虑用字符型数组储存;

    定义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;
}
   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值