大数除法(lld最多19位)

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

有两个大整数a和b,当a==b时,a/b==1,余数是0。(a!=0,b!=0)

                                     当a>b时,a/b>=1,余数需要通过计算求得。

                                     当a<b时,a/b=0,余数就是a。

以7546除23为例。

先减去23的100倍,就是2300,可以减3次,余下646。   此时商就是300;

然后646减去23的10倍,就是230,可以减2次,余下186。此时商就是320;

然后186减去23,可以减8次,此时商就是328.

特例

本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

#include<stdio.h>
#include<string.h>
int main(){
    char a[2000],q[2000];
    int  b,r,len,i,temp;
    r=0;
    scanf("%s",a);
    len=strlen(a);
    scanf("%d",&b);
    if(len==1&&a[0]-'0'<b){
        printf("0 %c",a[0]);
        return 0;
    }
    for(i=0;i<len;i++){
        temp=r*10+a[i]-'0';
        q[i]=temp/b+'0';
        r=temp%b;
    }
    i=0;
    while(q[i]=='0')
        i++;
    for (; i < len; i++)  
        printf("%c", q[i]);  
    printf(" %d", r);  
    return 0;
}

正常的大数除法

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

 

posted @ 2018-06-09 21:23  leolaosao  阅读(441)  评论(0编辑  收藏  举报