大数除法 C语言

看大数除法有点苦逼,找了好几篇博客,都感觉难以理解,今天终于弄懂了

大数除法的核心:除法运算转化为减法运算根据除法运算的特点,

1、不停的用数位首(从除数第一位开始与被除数位数相等的那几位)减去除数,直到被除数位首小于除数

2、将次数保存在数组里,然后在被除数的的前面添一个0继续相减

3、按照以上方法继续运算,直到数位尾从被除数最后一位开始与除数位数相等的那几位)相减之后即可结束。

例子如下:被除数446,除数23       

 

代码如下:
#include<stdio.h>
#include<string.h>
#define M 1000005
char s1[M],s2[M];
int a[M];
void ss(int m)//减运算
{
    int i=0,j;
    while(1)
    {
        if(s1[i]=='0') i++;
        else
        {
            j=i;
            break;
        }
    }
    for(; i<m; i++)
        s1[i]=s1[i]-s2[i]+'0';
    for(i=m-1; i>j; i--)
        if(s1[i]<'0')
        {
            s1[i]+=10;;
            s1[i-1]--;
        }
}
int main()
{
    int i,j,k,n,m;
    while(~scanf("%s%s",s1,s2))
    {
        n=strlen(s1);
        m=strlen(s2);
        if(n<m||n==m&&strcmp(s1,s2)<0)//特殊情况判断
        {
            printf("0 余数=");//求余数
            for(i=0; i<n; i++)
                printf("%d",s1[i]-'0');
            printf("\n");
            continue;
        }
        k=0;
        while(1)
        {
            a[k]=0;
            while(strcmp(s1,s2)>=0)//一直进行减法,直到不能减为止
            {
                ss(m);
                a[k]++;
            }
            k++;
            if(n==m)   break;
            for(i=m-1; i>=0; i--) //在s2前面补0,以便进行减法运算
                s2[i+1]=s2[i];
            s2[0]='0';
            m++;
            s2[m]='\0';//strcmp()函数遇到字符'\0'结束
        }
        i=0;
        while(a[i]==0) i++;//去除前导0
        for(; i<k; i++)
            printf("%d",a[i]);
        printf(" 余数=");
        j=0;//求余数
        while(s1[j]=='0')  j++;
        if(j==n)
        {
            printf("0\n");
            continue;
        }
        for(; j<n; j++)
            printf("%d",s1[j]-'0');
        printf("\n");
    }
    return 0;
}

 

 

 

 

 

 

以下是一段C语言大数除法代码: ``` #include <stdio.h> #include <string.h> #define MAX_DIGITS 1000 int dividend[MAX_DIGITS], divisor[MAX_DIGITS], quotient[MAX_DIGITS], remainder[MAX_DIGITS]; void divide(int dividend[], int divisor[], int quotient[], int remainder[]) { int i, j; int dividend_len = strlen(dividend); int divisor_len = strlen(divisor); for (i = 0; i < dividend_len; i++) { remainder[i] = dividend[i] - '0'; } int remainder_len = dividend_len; while (remainder_len > 0 && remainder[remainder_len - 1] == 0) { remainder_len--; } if (remainder_len < divisor_len) { quotient[0] = 0; return; } int shift = remainder_len - divisor_len; for (i = divisor_len - 1; i >= 0; i--) { divisor[i + shift] = divisor[i]; } for (i = 0; i < shift; i++) { divisor[i] = 0; } divisor_len = remainder_len; while (shift >= 0) { int d = 0; while (d < 10 && memcmp(divisor, remainder, divisor_len) <= 0) { d++; for (i = divisor_len - 1; i >= 0; i--) { remainder[i + 1] = remainder[i]; } remainder_len++; remainder[0] = 0; for (i = 0; i < divisor_len; i++) { remainder[i] += divisor[i]; if (remainder[i] > 9) { remainder[i] -= 10; remainder[i + 1]++; } } } quotient[shift] = d - 1; for (i = 0; i < divisor_len; i++) { remainder[i] -= divisor[i]; if (remainder[i] < 0) { remainder[i] += 10; remainder[i + 1]--; } } while (remainder_len > 0 && remainder[remainder_len - 1] == 0) { remainder_len--; } shift--; } } int main() { char dividend_str[MAX_DIGITS]; char divisor_str[MAX_DIGITS]; printf("Enter dividend: "); scanf("%s", dividend_str); printf("Enter divisor: "); scanf("%s", divisor_str); divide(dividend_str, divisor_str, quotient, remainder); printf("Quotient: "); int i = MAX_DIGITS - 1; while (i > 0 && quotient[i] == 0) { i--; } for (; i >= 0; i--) { printf("%d", quotient[i]); } printf("\n"); printf("Remainder: "); i = MAX_DIGITS - 1; while (i > 0 && remainder[i] == 0) { i--; } for (; i >= 0; i--) { printf("%d", remainder[i]); } printf("\n"); return 0; } ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值