大数(大数的四则运算)

/*
    大数计算(重点)
*/

//大数加法



struct bigInteger
{
    int digit[1000];
    int size;
    int sign;//标识正负  1为正,-1为负

    void init()
    {
        for(int i=0; i<1000; i++)
            digit[i] = 0;
        size = 0;
    }

    void set(char str[])
    {
        init();
        int L = strlen(str);
        for(int i = L-1,j=0,temp=0,weight=1; i>=0; i--)
        {

            //j记录当前转化字符的个数
            //wight表示权重从1,10,100,1000依次增加
            //
            temp+=(str[i]-'0')*weight;
            j++;
            weight*=10;

            if(j%4==0||i==0) //若已经连续转了4个字符或者已经全部转完了
            {
                digit[size++] = temp;


                //重置
                j = 0;
                temp = 0;
                weight = 1;
            }

        }
    }//end set


    void output(FILE *fp)
    {
        char s[1000];//临时存放
        char stemp[1000];
        int j,n,t;//标记当前需要填充的0的个数


        printf("output size = %d\n",size);

        for(int i =size-1; i>=0; i--)
        {

            j = 0;
            if(i!=size-1)
            {
                itoa(digit[i],s,10);
                //fputs(s,fp);

                t = digit[i];
                while(t)
                {
                    j++;
                    t/=10;
                }

                n = 4-j;//需要填充0的个数


                for(int i=0; i<n; i++)
                    strcat(stemp,"0");

                strcat(stemp,s);
                fputs(stemp,fp);

                //当前不是最高位置的时候拿0来填充
                printf("%04d",digit[i]);

            }


            else
            {
                itoa(digit[i],s,10);
                fputs(s,fp);
                printf("%d",digit[i]);
            }

        }

        printf("\n");

    }//end output

    bigInteger operator+(bigInteger A)
    {
        bigInteger ret;//返回的结果

        ret.init();

        int carry = 0;//进位
        for(int i=0; i<A.size||i<size; i++)
        {
            int temp = A.digit[i]+digit[i]+carry;

            carry = temp/10000;//计算进位
            temp%=10000;
            ret.digit[ret.size++] = temp;
        }


        //保存进位
        if(carry!=0)
        {
            ret.digit[ret.size++] = carry;
        }

        return ret;
    }//end bigInteger


    /*
        高阶的阶乘
    */
    bigInteger operator *(int x)
    {
        bigInteger ret;//返回的结果
        ret.init();

        int carry = 0;

        for(int i=0; i<size; i++)
        {
            int temp = x*digit[i] + carry;

            carry = temp/10000;//求出进位

            temp%=10000;//除去进位
            ret.digit[ret.size++] = temp;//保留该位置

        }


        //最高位的进位
        if(carry!=0)
            ret.digit[ret.size++] =carry;


        return ret;
    }

    bigInteger operator /(int x)
    {
        bigInteger ret;
        ret.init();

        int remainder = 0;
        for(int i=size-1; i>=0; i--)
        {
            int t = (remainder*10000 + digit[i])/x;
            int r = (remainder*10000 + digit[i])%x;

            ret.digit[i] = t;
            remainder = r;


            printf("digit[i] = %d,remainder = %d,t = %d,r = %d\n",digit[i],remainder,t,r);

        }
        ret.size = 0;
        for(int i=0; i<100; i++)
            if(digit[i]!=0)
                ret.size = i;

        printf("i = %d\n",ret.size);

        ret.size++;


        for(int i=size-1; i>=0; i--)
            printf("reuslt = %d\n",ret.digit[i]);

        return ret;
    }


    bigInteger operator - (bigInteger A)
    {
        bigInteger ret;//返回的结果
        ret.init();

        int borrow = 0;//借位

        for(int i=0; i<size||i<A.size; i++)
        {
            // printf("digit[i] = %d borrow = %d A.digit[i] = %d\n",digit[i],borrow,A.digit[i]);
            int temp = digit[i]  - A.digit[i]-borrow;

            if(temp<0)
            {
                temp+=10000;
                ret.digit[ret.size++] = temp;//保存该位的结果
                borrow = 1;
            }
            else
            {
                if(i == size -1&&temp == 0)
                    continue;

                ret.digit[ret.size++] = temp;
                borrow = 0;//没有借位
            }


        }


        return ret;
    }

    long long operator %(int x)
    {
        long long remainder = 0;//余数

        for(int i=size-1; i>=0; i--)
        {
            long long t = (remainder*10000+digit[i])/x;
            long long r = (remainder*10000+digit[i])%x;

            remainder = r;

            printf("digit[i] = %d,t = %d,r = %d,remiander = %d\n",digit[i],t,r,remainder);
        }

        return remainder;

    }

    int operator >(bigInteger A)
    {
        /*
            > 1
            < -1
            = 0
        */
        if(size == A.size)
        {
            for(int i=size-1; i>=0; i--)
            {
                if(digit[i]>A.digit[i])
                    return 1;

                else if(digit[i]<A.digit[i])
                    return -1;
            }
            return 0;
        }
        else
        {
            if(size>A.size)
                return 1;

            else
                return -1;
        }
    }

} a,b,c;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值