我们平时做除法时,采用立竖式的方法计算:

被除数从高位开始,和被除数对齐,诸位“试商”,“试商”后被除数减去“试商”的数的乘积,如下图所示:

采用计算机做高精度除法时,模拟日常除法的步骤。但计算机不可能做“试商”,这时,我们可以采用减法来模拟

"试商"的过程。算法的步骤如下:

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

 

posted on 2018-11-26 10:30  noipbar  阅读(7700)  评论(0编辑  收藏  举报