• 大数除法


    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdbool.h>
    
    #define MaxSize 10000
    
    bool _DividendIsLarger(int *Dividend,int *Divisor,int DividendLen,int DivisorLen)
    {
        int DivisorLenEnd;
        if(DividendLen < DivisorLen)
        {
            return false;
        }
        else if(DividendLen == DivisorLen)
        {
            for(DivisorLenEnd = DividendLen - 1;DivisorLenEnd >= 0;DivisorLenEnd --)
            {
                if(Dividend[DivisorLenEnd] < Divisor[DivisorLenEnd])
                {
                    return false;
                }
            }
        }
        return true;
    }
    
    //sub's result store in Dividend[],return the length of Dividend[]
    int _TwoBigNumSub(int *Dividend,int *Divisor,int DividendLen,int DivisorLen)
    {
        //judge if Dividend > Divisor,else return -1
        bool Judger = _DividendIsLarger(Dividend,Divisor,DividendLen,DivisorLen);
        if(! Judger)
        {
            return -1;
        }
        
        //do the Sub
        int DivisorEnd;
        for(DivisorEnd = 0;DivisorEnd < DividendLen;DivisorEnd ++)
        {
            Dividend[DivisorEnd] -= Divisor[DivisorEnd];
            if(Dividend[DivisorEnd] < 0)
            {
                Dividend[DivisorEnd] += 10;
                Dividend[DivisorEnd+1] --;
            }
        }
        
        for(DivisorEnd = DividendLen-1;DivisorEnd >= 0;DivisorEnd --)
        {
            if(Dividend[DivisorEnd])
            {
                return (DivisorEnd + 1);
            }
        }
        return 0;
    }
    
    char *TwoBigNumDivision(char *InputDividend,char *InputDivisor)
    {
        int *TempResult = malloc(MaxSize*sizeof(int));
        memset(TempResult,0,MaxSize*sizeof(int));
        char *Result = malloc(MaxSize*sizeof(char));
        memset(Result,0,MaxSize*sizeof(char));
        int ResultEnd = 0;
        
        int DividendLen = strlen(InputDividend);
        int DivisorLen = strlen(InputDivisor);
        
        int Dividend[MaxSize];
        int Divisor[MaxSize];
        memset(Dividend,0,sizeof(Dividend));
        memset(Divisor,0,sizeof(Divisor));
        
        //reverse to store
        int InputDivisorEnd,DivisorEnd;
        for(InputDivisorEnd = DividendLen-1,DivisorEnd = 0;InputDivisorEnd >= 0;InputDivisorEnd --)
        {
            Dividend[DivisorEnd ++] = InputDividend[InputDivisorEnd] - '0';
        }
        for(InputDivisorEnd = DivisorLen-1,DivisorEnd = 0;InputDivisorEnd >= 0;InputDivisorEnd --)
        {
            Divisor[DivisorEnd ++] = InputDivisor[InputDivisorEnd] - '0';
        }
        
        //special discuss for zero && one time sub
        if(! _DividendIsLarger(Dividend,Divisor,DividendLen,DivisorLen))
        {
            Result[ResultEnd++] = '0';
            Result[ResultEnd++] = '';
            return Result;
        }
        
        DividendLen = _TwoBigNumSub(Dividend,Divisor,DividendLen,DivisorLen);
        if(DividendLen == -1)
        {
            Result[ResultEnd++] = '0';
            Result[ResultEnd++] = '';
            return Result;
        }
        else if(DividendLen == 0)
        {
            Result[ResultEnd++] = '1';
            Result[ResultEnd++] = '';
            return Result;
        }
        TempResult[0] ++;
        
        int ZeroCompletion = DividendLen - DivisorLen;
        
        if(ZeroCompletion < 0)
        {
            Result[ResultEnd++] = '1';
            Result[ResultEnd++] = '';
            return Result;
        }
        else if(ZeroCompletion > 0)
        {
            for(DivisorEnd = DividendLen - 1;DivisorEnd >= 0;DivisorEnd --)
            {
                if(DivisorEnd >= ZeroCompletion)
                {
                    Divisor[DivisorEnd] = Divisor[DivisorEnd - ZeroCompletion];
                }
                else
                {
                    Divisor[DivisorEnd] = 0;
                }
            }
        }
        
        int Temp;
        DivisorLen = DividendLen;
        for(DivisorEnd = 0;DivisorEnd <= ZeroCompletion;DivisorEnd ++)
        {
            while( (Temp = _TwoBigNumSub(Dividend,Divisor+DivisorEnd,DividendLen,DivisorLen-DivisorEnd)) >= 0)
            {
                DividendLen = Temp;
                TempResult[ZeroCompletion-DivisorEnd] ++;
            }
        }
        
        //output
        for(DivisorEnd = 0;DivisorEnd < MaxSize;DivisorEnd ++)
        {
            if(TempResult[DivisorEnd] >= 10)
            {
                TempResult[DivisorEnd+1] +=  TempResult[DivisorEnd]/10;
                TempResult[DivisorEnd] %= 10;
            }
        }
        for(DivisorEnd = MaxSize-1;DivisorEnd >= 0;DivisorEnd --)
        {
            if(TempResult[DivisorEnd] != 0)
            {
                break;
            }
            else if(DivisorEnd == 0 && TempResult[DivisorEnd] == 0)
            {
                Result[ResultEnd++] = '0';
                Result[ResultEnd++] = '';
                return Result;
            }
        }
        
        for(;DivisorEnd >= 0;DivisorEnd --)
        {
            Result[ResultEnd++] = TempResult[DivisorEnd] + '0';
        }
        Result[ResultEnd]= '';
        return Result;
    }
    
    int main()
    {
        char InputDividend[MaxSize] = "5409656775097850895687056798068970934546546575676768678435435345";
        char InputDivisor[MaxSize] = "1";
        char *Result = TwoBigNumDivision(InputDividend,InputDivisor);
        puts(Result);
        return 0;
    } 
  • 相关阅读:
    P1006 传纸条
    P1387 最大正方形
    P1417 烹调方案
    P1052 过河
    P1063 能量项链
    P1736 创意吃鱼法
    P1156 垃圾陷阱
    P1220 关路灯
    @P1373 小a和uim之大逃离
    【leetcode】Interleaving String
  • 原文地址:https://www.cnblogs.com/Asurudo/p/9427295.html
Copyright © 2020-2023  润新知