高精度除高精度

算法流程:
第一步,讀入被除數 a 和 除數 b,判斷是否 a < b,是則輸出 0 並結束算法,否則令 answer := 0;
第二步,令餘數 remainder := 0,令 i 從被除數最高位的下標開始;
第三步,令 remainder := remainder * 10 + a[i],令 c := 9;
第四步,判斷是否 b * c > remainder(高乘單),是則 c := c - 1 轉第四步;
第五步,answer = answer * 10 + c,remainder = remainder - b * c(高減高),i 右移一位;
第六步,判斷是否 i 溢出,否則轉第三步;
第七步,輸出 answer。

代碼如下:

#include"stdio.h"
#include"string.h"
#define MAX_SIZE 505
char temporary_a[MAX_SIZE],temporary_b[MAX_SIZE];
int a[MAX_SIZE],answer[MAX_SIZE],b[MAX_SIZE],product[MAX_SIZE],remainder[MAX_SIZE];
int main()
{
    //freopen("HighDivide.in","r",stdin);
    //freopen("HighDivide.out","w",stdout);
    int a_length,b_length,product_length,remainder_length;
    scanf("%s",temporary_a);
    a_length=remainder_length=strlen(temporary_a);
    for(int i=0;i<a_length;i++)
        a[i]=temporary_a[a_length-i-1]-'0';
    scanf("%s",temporary_b);
    b_length=strlen(temporary_b);
    for(int i=0;i<b_length;i++)
        b[i]=temporary_b[b_length-i-1]-'0';
    if(a_length<b_length||a_length==b_length&&strcmp(temporary_a,temporary_b)<0)
    {
        printf("0");
        return 0;
    }
    for(int i=a_length-1;i>=0;i--)
    {
        remainder[i]=a[i];
        for(answer[i]=9;answer[i]>0;answer[i]--)
        {
            product[i]=0;
            product_length=b_length+i;
            for(int j=0;j<b_length;j++)
                product[i+j]+=answer[i]*b[j],
                product[i+j+1]=product[i+j]/10,
                product[i+j]%=10;
            if(product[product_length]!=0)
                product_length++;
            if(product_length==remainder_length)
            {
                memset(temporary_a,'0',sizeof(temporary_a));
                memset(temporary_b,'0',sizeof(temporary_b));
                for(int j=0;i+j<product_length;j++)
                    temporary_a[j]=product[product_length-j-1]+'0';
                for(int j=0;i+j<remainder_length;j++)
                    temporary_b[j]=remainder[remainder_length-j-1]+'0';
            }
            if(product_length<remainder_length||product_length==remainder_length&&strcmp(temporary_a,temporary_b)<=0)
                break;
        }
        if(answer[i]!=0)
        {
            for(int j=i;j<remainder_length;j++)
                remainder[j]-=product[j]-10,remainder[j+1]-=1-remainder[j]/10,remainder[j]%=10;
            for(;remainder_length>i&&remainder[remainder_length-1]==0;remainder_length--);
        }
    }
    if(answer[a_length-b_length]==0)
        a_length--;
    for(int i=a_length-b_length;i>=0;i--)
        printf("%d",answer[i]);
    return 0;
}
發佈了50 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章