1. 主页
  2. 文档
  3. Level3题解(1-10)
  4. 第1课 高精度计算
  5. 高精度减法

高精度减法

先在纸上书写几个代表性的减法式子并进行分析,提炼出处理模块

     90
  - 215
---------
  - 125

   3100
  - 215
---------
   2885

     190
  -  190
---------
       0

首先要比较两个高精度数的大小
分为三种情况

  • a==b相等则输出0
  • a>b,计算a-b并输出
  • a<b,输出 – 号,计算b-a并输出
    计算的时候存在着向高位借位的情况
    处理差的位数
	927
-	896
-----------
	  1	7-6=1
         3	   12-9=3,借位12
	0	(9-1)-8=0
-----------
	 31

主模块可编写如下:

int main(){
	int a[N],b[N],f;
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	Read(a);
	Read(b);
	f=Comp(a,b);
	if(f==0){
		cout<<0;
		return 0;
	}
	if(f>0) {
		Minus(a,b);
		Out(a);
	}
	else {
		cout<<'-';
		Minus(b,a);
		Out(b);
	}
	return 0;
}

比较模块

int Comp(int a[],int b[]){//比较a和b的大小关系,若a>b则为1,a<b则为-1,a=b则为0 
     if(a[0]>b[0])return 1;   //a的位数大于b,则a比b大 
     if(a[0]<b[0])return -1;  //a的位数小于b,则a比b小 
     for(int i=a[0];i>0;i--) { //否则a和b的位数相同,则从高位到低位比较 
         if(a[i]>b[i])return 1; 
         if(a[i]<b[i])return -1;
     } 
     return 0;//各位都相等则两数相等。 	
}

减法模块

void Minus(int a[],int b[]){//计算a=a-b
      for(int i=1;i<=a[0];i++){
      	if(a[i]<b[i]){ a[i+1]--;a[i]+=10;} //若不够减则向上借一位 
         a[i]=a[i]-b[i]; 
      } 
      while(a[0]>0&&a[a[0]]==0) a[0]--; //修正a的位数 
      return;
}