加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数除法

发布时间:2020-12-14 03:51:16 所属栏目:大数据 来源:网络整理
导读:#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 f
#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 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,MaxSize*sizeof(char));
    int ResultEnd = 0;
    
    int DividendLen = strlen(InputDividend);
    int DivisorLen = strlen(InputDivisor);
    
    int Dividend[MaxSize];
    int Divisor[MaxSize];
    memset(Dividend,sizeof(Dividend));
    memset(Divisor,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,DivisorLen))
    {
        Result[ResultEnd++] = 0;
        Result[ResultEnd++] = ;
        return Result;
    }
    
    DividendLen = _TwoBigNumSub(Dividend,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,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;
} 

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读