• 大数除法(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("
    ");  
                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]='';//strcmp()函数遇到字符''结束  
            }  
            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
    ");  
                continue;  
            }  
            for(; j<n; j++)  
                printf("%d",s1[j]-'0');  
            printf("
    ");  
        }  
        return 0;  
    }  
    努力变得不白
  • 相关阅读:
    WPF Prefix 'attach' does not map to a namespace.
    C# 用ManulResetEvent 控制Thread的 Suspend、Resume
    C# 监控Windows睡眠与恢复
    c# DataTable to Object Mapping
    C# DispatcherTimer Start之后立即执行
    Visual studio 编译时copy文件、文件夹
    c# 无法加载xxx.dll 找不到指定的模块(如何指定文件夹)
    EntityFramework 找不到方法:“Void System.Data.Entity.DbModelBuilder.RegisterEntityType
    wpf 全局异常捕获处理
    pandas入门
  • 原文地址:https://www.cnblogs.com/leolaosao/p/9160886.html
Copyright © 2020-2023  润新知