我们平时做除法时,采用立竖式的方法计算:
被除数从高位开始,和被除数对齐,诸位“试商”,“试商”后被除数减去“试商”的数的乘积,如下图所示:
采用计算机做高精度除法时,模拟日常除法的步骤。但计算机不可能做“试商”,这时,我们可以采用减法来模拟
"试商"的过程。算法的步骤如下:
1、将除数移动和被除数对齐,位数不够时,补0,
2、利用被除数减去除数,一直减到被除数小于除数,减的次数,就是“试商”的结果,每移动一次。
3、重复上述步骤,一直到被除数和除数的位数相等为止。
高精度算法的代码如下:
#include <iostream> #include <cstring> using namespace std; const int N =1001; int aa[N],bb[N],cc[N]; //定义计算数和输出结果 void inputNum(string ss,int a[]); //输入需要计算的数保存到数组 void printArr(int a[]); //输出数组的元素 void jian(int a[],int b[]); void jisuan(int a[],int b[],int c[]); void movei(int a[],int b[],int i); int compare (int a[],int b[]); //比较两个高精度数大小 int main() { string s1 ="525353422"; string s2 ="253532"; inputNum(s1,aa); printArr(aa); inputNum(s2,bb); printArr(bb); if (compare(aa,bb) ==0) cout<<1<<endl; else if (compare(aa,bb)) { jisuan(aa,bb,cc); } else if (compare(aa,bb)<0) { jisuan(bb,aa,cc); } printArr(cc); printArr(aa); return 0; } int compare (int a[],int b[]) { int i; if (a[0]>b[0]) return 1; if (a[0]<b[0]) return -1; for (i=a[0];i>0;i--) { if (a[i]>b[i]) return 1; if (a[i]<b[i]) return -1; } return 0; } void movei(int a[],int b[],int j) { for (int i=1;i<=a[0];i++) { b[i+j-1] =a[i]; } b[0] = a[0]+j-1; } void jisuan(int a[],int b[],int c[]) { c[0] = a[0]-b[0]+1; //上的位数 int temp[1001]; //临时数组,用于对除数进行移动 for (int i=c[0];i>0;i--) { memset(temp,0,sizeof(temp)); //全置为0 movei(b,temp,i); //高位对齐 while (compare(a,temp)>=0) { c[i]++; //每次加1 jian(a,temp); } } int m=c[0]; while (c[0]>0 && c[m]==0) //处理商的位数 { c[0]--; } } void jian(int a[],int b[]) { for (int i=1;i<=a[0];i++) { if (a[i]<b[i]) { a[i+1]--; a[i]+=10; } a[i]-=b[i]; } int i=a[0]; while (a[i]==0) { i--; } a[0]=i; } void inputNum(string ss,int a[]) { int len = ss.length(); a[0] = len; for (int i=0;i<len;i++) { a[len-i] = ss[i] -48;//字符变成数字,并且倒序存储 } } void printArr(int a[]) { for (int i=a[0];i>0;i--) { cout<<a[i]; } cout<<endl; }