zoukankan      html  css  js  c++  java
  • 大整数除法,C语言基础语法实现

    #include<stdio.h>
    #include<string.h>
    #define N 2004
    void change(char c[],int n[]);
    int Sub(int *a,int *b,int lena,int lenb);
    int main()
    {
        char x[N],y[N];
        int a[N]={0},b[N]={0};
        scanf("%s %s",x,y);
        change(x,a);
        change(y,b);
        int lena=strlen(x);
        int lenb=strlen(y);
        int ans[N]={0};
        if(lena<lenb)
        printf("0
    ");
        else
        {
            int s=Sub(a,b,lena,lenb);
            if(s<0)
            printf("0
    ");
            else if(s==0)
            printf("1
    ");
            else
            {
                int i,j;
                lena=s;
                ans[0]++;
                int ntimes=lena-lenb;
                for(i=lena;i>=0;i--)
                if(i>=ntimes)
                b[i]=b[i-ntimes];
                else
                b[i]=0;
                lenb=lena;
                for(j=0;j<=ntimes;j++)
                {
                    int buffer;
                    while(1)
                    {
                        
                        buffer=Sub(a,b+j,lena,lenb-j);
                        if(buffer<0)
                        break;
                        ans[ntimes-j]++;
                        lena=buffer;
                    }
                }
                for(i=0;i<=ntimes;i++)
                if(ans[i]>9)
                {
                    ans[i+1]+=ans[i]/10;
                    ans[i]=ans[i]%10;
                }
                for(i=ntimes;i>=0;i--)
                printf("%d",ans[i]);
                printf("
    ");
            }
        }
        return 0;
    }
    
    void change(char c[],int n[])
    {
        int i,j=0;
        for(i=strlen(c)-1;i>=0;i--)
        n[j++]=c[i]-'0';
    }
    int Sub(int *a,int *b,int lena,int lenb)
    {
        int i,f=0;
        if(lena<lenb)
        return -1;
        else if(lenb==lena)
        {
            for(i=lena-1;i>=0;i--)
            {
                if(a[i]<b[i])
                return -1;
                else if(a[i]>b[i])
                break;
            }
        }
        for(i=0;i<lena;i++)
        {
            a[i]-=b[i];
            if(a[i]<0)
            {
                a[i]+=10;
                a[i+1]--;
            }
        }
        for(i=lena-1;i>=0;i--)
        {    
            if(a[i]!=0)
            return i+1;
        }    
        return 0;
    }
    

     因为是第一次写blog,代码没有给出注释,如果你在浏览时有什么疑问,请在下方留言。如果需要交流请直接给我发消息,若需转载请注明,谢谢!*^_^*

  • 相关阅读:
    Luogu4433:[COCI2009-2010#1] ALADIN(类欧几里德算法)
    Bzoj4766: 文艺计算姬(Matrix-tree/prufer)
    Bzoj5019: [Snoi2017]遗失的答案
    [HAOI2009]逆序对数列(加强)
    CF850F Rainbow Balls
    Luogu4887 第十四分块(前体)
    Luogu2483 [SDOI2010]魔法猪学院(可并堆)
    导数积分表
    Bzoj2395: [Balkan 2011]Timeismoney(最小乘积生成树)
    Min_25筛
  • 原文地址:https://www.cnblogs.com/xiaok-redback/p/4227570.html
Copyright © 2011-2022 走看看