OpenJudge百炼-2737-大整数除法-C语言-高精度计算

描述:
求两个大的正整数相除的商。
输入:
第1行是被除数,第2行是除数。每个数均不超过100位。
输出:
一行,相应的商的整数部分
样例输入:
2376
24
样例输出:
99

/***********************************************
**文件名:百炼-2737
**Copyright (c) 2015-2025 OrdinaryCrazy
**创建人:OrdinaryCrazy
**日期:20170813
**描述:百炼2737参考答案
**版本:1.0
************************************************/
/***********************************************
基本的思想就是反复做除法,看看从被除数里最多能减去多少个除数
************************************************/
#include 
#include 
int dividend[100],divisor[100],quotient[100],len1,len2;
char line1[101],line2[101];
/***************************************************
长度为lenn1的大整数p1减去长度为lenn2的大整数p2
减得结果放在p1里返回值代表结果的长度,不够减返回-1,正好剪完返回0
****************************************************/
int substract(int* p1,int* p2,int lenn1,int lenn2)
{
    int i;
    if(lenn1 < lenn2) return -1;
    if(lenn1 == lenn2)
        for(i = lenn1-1;i>=0;i--)
        {
            if(p1[i] > p2[i])
                break;
            else if(p1[i] < p2[i]) return -1;
            else continue;
        }
    for(i = 0;i < lenn1;i++)
    {
        p1[i] -= p2[i];
        if(p1[i] < 0)
        {
            p1[i] += 10;
            p1[i+1]--;
        }
    }
    for(i = lenn1-1;i >= 0;i--)
        if(p1[i]) break;
    return i+1;
}
int main()
{
    int i,j;
    gets(line1);
    gets(line2);
    len1 = strlen(line1);
    len2 = strlen(line2);
    for(i = len1-1,j = 0;i >= 0;i--,j++)
        dividend[j] = line1[i] - '0';
    for(i = len2-1,j = 0;i >= 0;i--,j++)
        divisor[j] = line2[i] - '0';
    len1 = substract(dividend,divisor,len1,len2);
    if(len1 == -1)
    {
        printf("0");
        return 0;
    }
    if(len1 == 0)
    {
        printf("1");
        return 0;
    }
    quotient[0]++;
    int times = len1 - len2;
    for(i = len1-1;i >= 0;i--)
    {
        if(i >= times)
            divisor[i] = divisor[i - times];
        else
            divisor[i] = 0;
    }
    len2 = len1;
    for(j = 0;j <= times;j++)
    {
        int tmp;
        while((tmp = substract(dividend,divisor+j,len1,len2-j)) >= 0)
        {
            len1 = tmp;
            quotient[times-j]++;
        }
    }
    for(i = 0;i < 99;i++)
        if(quotient[i] >= 10)
        {
            quotient[i+1] += quotient[i]/10;
            quotient[i] %= 10;
        }
    i = 99;
    while(!quotient[i] && i >=0) i--;
    if(i == -1)
        printf("0");
    else
        while(i >= 0)
            printf("%d",quotient[i--]);
    return 0;
}

你可能感兴趣的:(C语言,OpenJudge)