高精度运算专题2-减法运算(The subtraction operation)
2015-03-22 12:29
471 查看
这个专题呢,我就来讲讲高精度的减法,下面是三个计算减法的函数,第一个函数是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则大
代码如下:
函数2思路:这个减法函数和函数1差不多的,只是省去了把字符串转换成数字的部分
代码如下:
函数3思路:这个函数优化了函数2,不用再开一个数组,大大地节省了时间
①首先得把数组a和数组b的长度分别存入a[0]、b[0]
②做减法,不够十要借位,十位数要加10,减去不够减的数
③最重要的一步:高位可能会有很多0,记得要消去
代码如下:
函数4思路:这个函数优化了函数3,a=a-b,a>0返回1,a==0返回0,a<0返回-1,不过这个地方默认a>=b,主要是用于除法的操作过程
代码如下:
函数1思路:要先把char类型的转换成int类型的数,直接每个数-‘0’就可以实现把char类型的转换成int类型的了。
①记录数组a、数组b、数组c的长度,放到第一位
②比较数组a和数组b的大小(长度长的大),如果大,交换也
③从前往后扫描数组a和数组b,每一位相减,如果数组a中的那一位<数组b中的那一位,就要借位(十位加十),再相减,存入数组c
注释:最后返回的ans是数组a与b的大小,-1则小,0则等,1则大
代码如下:
int sub(char strA[],char strB[],int c[]) //两个高精度的正整数a、b,计算a-b,结果放在c。 //c>0返回1;c==0返回0,c<0返回-1 { char t[MaxLength]; int a[MaxLength]={0},b[MaxLength]={0}; int ans=1,i; int lenA,lenB,lenC,temp; memset(c,0,sizeof(c)); lenA=strlen(strA); lenB=strlen(strB); if( lenA<lenB || ( lenA==lenB && strcmp(strA,strB)<0 ) ) { strcpy(t,strA); strcpy(strA,strB); strcpy(strB,t); ans=-1; } else if(strcmp(strA,strB)==0) { ans=0; c[0]=1; return ans; } init(strA,a);//从低位到高位存储 init(strB,b);//从低位到高位存储 i=1; while(i<=a[0]||i<=b[0]) { if(a[i]<b[i])//借位 { a[i]+=10; a[i+1]--; } c[i]=a[i]-b[i];//注意:现在的C数组是从低位到高位存储的。 i++; } lenC=i; while((c[lenC]==0)&&(lenC>1)) lenC--;//最高位的0不输出 c[0]=lenC; return ans; }
函数2思路:这个减法函数和函数1差不多的,只是省去了把字符串转换成数字的部分
代码如下:
int sub2(int a[],int b[],int c[])// 输入高精度正整数a和b,计算a-b,结果存储在c。 c>0返回1;c==0返回0,c<0返回-1 { int ans,i,temp,len; int lenC; memset(c,0,sizeof(c)); ans=cmp(a,b); if(ans==0) { c[0]=1; c[1]=0; return ans; } else if(ans == -1) {//这里是表示a<b时要交换a和b len=( a[0]>b[0] ? a[0] : b[0] ); for(i=0;i<=len;i++) { temp=a[i];a[i]=b[i];b[i]=temp; } } //下面开始做减法操作 i=1; while(i<=a[0]||i<=b[0]) { if(a[i]<b[i]) { a[i]+=10; a[i+1]--; } c[i]=a[i]-b[i];//注意:现在的C数组是从低位到高位存储的。 i++; } lenC=i; while((c[lenC]==0)&&(lenC>1)) lenC--;//消除高位无意义的0 c[0]=lenC; return ans; }
函数3思路:这个函数优化了函数2,不用再开一个数组,大大地节省了时间
①首先得把数组a和数组b的长度分别存入a[0]、b[0]
②做减法,不够十要借位,十位数要加10,减去不够减的数
③最重要的一步:高位可能会有很多0,记得要消去
代码如下:
int sub3(int a[],int b[])//a=a-b 。 计算结果 a>0返回1;a==0返回0,a<0返回-1 { int ans,i,temp,len; int lenA; ans=cmp(a,b); if(ans==0) { a[0]=1; a[1]=0; return ans; } else if(ans==-1) { len=( a[0]>b[0] ? a[0] : b[0] );//这里是表示a<b时要交换a和b for(i=0;i<=len;i++)//排序 { temp=a[i]; a[i]=b[i]; b[i]=temp; } } //下面开始做减法操作 i=1; while(i<=a[0]||i<=b[0]) { if(a[i]<b[i])//借位 { a[i]+=10; a[i+1]--; } a[i]=a[i]-b[i];//注意:现在的a数组是从低位到高位存储的。 i++; } lenA=i; while((a[lenA]==0)&&(lenA>1)) lenA--;//消除高位无意义的0 a[0]=lenA; return ans; }
函数4思路:这个函数优化了函数3,a=a-b,a>0返回1,a==0返回0,a<0返回-1,不过这个地方默认a>=b,主要是用于除法的操作过程
代码如下:
int sub4(int a[],int b[])//a=a-b 。a>0返回1,a==0返回0,a<0返回-1,不过这个地方默认a>=b,主要是用于除法的操作过程 { int ans,i,temp,len; int lenA; ans=cmp(a,b); if(ans==0) { a[0]=1; a[1]=0; return ans; } else if(ans==1) { //下面开始做减法操作 i=1; while(i<=a[0]) { if(a[i]<b[i]) { a[i]+=10; a[i+1]--; } a[i]=a[i]-b[i];//注意:现在的a数组是从低位到高位存储的。 i++; } lenA=i; while((a[lenA]==0)&&(lenA>1)) lenA--;//消除高位无意义的0 a[0]=lenA; } return ans; }
相关文章推荐
- 高精度运算专题1-加法运算(The addition operation)
- 高精度运算专题3-乘法运算(The multiplication operation)
- 高精度运算专题-输出函数与字符串转数字函数(Output function and the string to number function)
- 高精度运算-(加法减法乘法)
- 高精度计算----减法运算(续)
- 高精度计算----减法运算
- 高精度计算----减法运算(浮点型)
- 数论专题---除法表达式之高精度运算,扩展欧几里得算法
- CodeForces 288C Polo the Penguin and XOR operation (位运算,异或)
- 整数高精度运算的库(加法,减法,乘法,除法,取模)
- 图像运算(二)——减法(Subtraction)
- 高精度计算----减法运算
- 大数减法 (高精度运算)
- 高精度之减法运算
- Could not complete the operation due to error80020101
- Apache无法启动解决 the requested operation has failed
- Operation Considerations of the Dryer
- iOS 当运行Xcode6时,编译代码成功,但是登陆模拟器失败,显示错误:The Operation couldn't be completed.(LaunchServicesError error
- FPGA进行减法运算
- 高精度练习之减法