高精度运算专题2-减法运算(The subtraction operation)
这个专题呢,我就来讲讲高精度的减法,下面是三个计算减法的函数,第一个函数是char类型的,要对字符串进行数字转换,而第二个是两个int类型的数组,不用转换成数字,第三个则更为优化,用a数组-b数组放回数组a里面
函数1思路:要先把char类型的转换成int类型的数,直接每个数-‘0’就可以实现把char类型的转换成int类型的了。
①记录数组a、数组b、数组c的长度,放到第一位
②比较数组a和数组b的大小(长度长的大),如果大,交换也
③从前往后扫描数组a和数组b,每一位相减,如果数组a中的那一位<数组b中的那一位,就要借位(十位加十),再相减,存入数组c
注释:最后返回的ans是数组a与b的大小,-1则小,0则等,1则大
代码如下:
1 int sub(char strA[],char strB[],int c[]) 2 //两个高精度的正整数a、b,计算a-b,结果放在c。 3 //c>0返回1;c==0返回0,c<0返回-1 4 { 5 char t[MaxLength]; 6 int a[MaxLength]={0},b[MaxLength]={0}; 7 int ans=1,i; 8 int lenA,lenB,lenC,temp; 9 memset(c,0,sizeof(c)); 10 lenA=strlen(strA); 11 lenB=strlen(strB); 12 if( lenA<lenB || ( lenA==lenB && strcmp(strA,strB)<0 ) ) 13 { 14 strcpy(t,strA); 15 strcpy(strA,strB); 16 strcpy(strB,t); 17 ans=-1; 18 } 19 else if(strcmp(strA,strB)==0) 20 { 21 ans=0; 22 c[0]=1; 23 return ans; 24 } 25 init(strA,a);//从低位到高位存储 26 init(strB,b);//从低位到高位存储 27 i=1; 28 while(i<=a[0]||i<=b[0]) 29 { 30 if(a[i]<b[i])//借位 31 { 32 a[i]+=10; 33 a[i+1]--; 34 } 35 c[i]=a[i]-b[i];//注意:现在的C数组是从低位到高位存储的。 36 i++; 37 } 38 lenC=i; 39 while((c[lenC]==0)&&(lenC>1)) lenC--;//最高位的0不输出 40 c[0]=lenC; 41 return ans; 42 }
函数2思路:这个减法函数和函数1差不多的,只是省去了把字符串转换成数字的部分
代码如下:
1 int sub2(int a[],int b[],int c[])// 输入高精度正整数a和b,计算a-b,结果存储在c。 c>0返回1;c==0返回0,c<0返回-1 2 { 3 int ans,i,temp,len; 4 int lenC; 5 memset(c,0,sizeof(c)); 6 7 ans=cmp(a,b); 8 if(ans==0) 9 { 10 c[0]=1; 11 c[1]=0; 12 return ans; 13 } 14 else if(ans == -1) 15 {//这里是表示a<b时要交换a和b 16 len=( a[0]>b[0] ? a[0] : b[0] ); 17 for(i=0;i<=len;i++) 18 { 19 temp=a[i];a[i]=b[i];b[i]=temp; 20 } 21 } 22 //下面开始做减法操作 23 i=1; 24 while(i<=a[0]||i<=b[0]) 25 { 26 if(a[i]<b[i]) 27 { 28 a[i]+=10; 29 a[i+1]--; 30 } 31 c[i]=a[i]-b[i];//注意:现在的C数组是从低位到高位存储的。 32 i++; 33 } 34 lenC=i; 35 while((c[lenC]==0)&&(lenC>1)) lenC--;//消除高位无意义的0 36 c[0]=lenC; 37 return ans; 38 }
函数3思路:这个函数优化了函数2,不用再开一个数组,大大地节省了时间
①首先得把数组a和数组b的长度分别存入a[0]、b[0]
②做减法,不够十要借位,十位数要加10,减去不够减的数
③最重要的一步:高位可能会有很多0,记得要消去
代码如下:
1 int sub3(int a[],int b[])//a=a-b 。 计算结果 a>0返回1;a==0返回0,a<0返回-1 2 { 3 int ans,i,temp,len; 4 int lenA; 5 ans=cmp(a,b); 6 if(ans==0) 7 { 8 a[0]=1; 9 a[1]=0; 10 return ans; 11 } 12 else if(ans==-1) 13 { 14 len=( a[0]>b[0] ? a[0] : b[0] );//这里是表示a<b时要交换a和b 15 for(i=0;i<=len;i++)//排序 16 { 17 temp=a[i]; 18 a[i]=b[i]; 19 b[i]=temp; 20 } 21 } 22 //下面开始做减法操作 23 i=1; 24 while(i<=a[0]||i<=b[0]) 25 { 26 if(a[i]<b[i])//借位 27 { 28 a[i]+=10; 29 a[i+1]--; 30 } 31 a[i]=a[i]-b[i];//注意:现在的a数组是从低位到高位存储的。 32 i++; 33 } 34 lenA=i; 35 while((a[lenA]==0)&&(lenA>1)) lenA--;//消除高位无意义的0 36 a[0]=lenA; 37 return ans; 38 }
函数4思路:这个函数优化了函数3,a=a-b,a>0返回1,a==0返回0,a<0返回-1,不过这个地方默认a>=b,主要是用于除法的操作过程
代码如下:
1 int sub4(int a[],int b[])//a=a-b 。a>0返回1,a==0返回0,a<0返回-1,不过这个地方默认a>=b,主要是用于除法的操作过程 2 { 3 int ans,i,temp,len; 4 int lenA; 5 6 ans=cmp(a,b); 7 if(ans==0) 8 { 9 a[0]=1; 10 a[1]=0; 11 return ans; 12 } 13 else if(ans==1) 14 { 15 //下面开始做减法操作 16 i=1; 17 while(i<=a[0]) 18 { 19 if(a[i]<b[i]) 20 { 21 a[i]+=10; 22 a[i+1]--; 23 } 24 a[i]=a[i]-b[i];//注意:现在的a数组是从低位到高位存储的。 25 i++; 26 } 27 lenA=i; 28 while((a[lenA]==0)&&(lenA>1)) lenA--;//消除高位无意义的0 29 a[0]=lenA; 30 } 31 return ans; 32 }
我不怕千万人阻挡,只怕自己投降…