zoukankan      html  css  js  c++  java
  • 高精度(正整数的加、减、乘法)

    #include<iostream>
    #include<cstring>
    using namespace std;
    struct bignum
    {
        int len;
        int num[505];
        bignum()
        {
            memset(num,0,sizeof(num));
        }
    } a,b,c;
    int cmp(bignum a,bignum b)
    {
        if(a.len>b.len)return 1;
        if(a.len<b.len)return 0;
        for(int i=1; i<=a.len; i++)
        {
            if(a.num[i]>b.num[i])return 1;
        }
        return 0;
    }
    bignum bigMinus(bignum a,bignum b)
    {
        bignum c;
        int clen=a.len;
        for(int i=1; i<=a.len; i++)
        {
            c.num[i]=a.num[i]-b.num[i];
            if(c.num[i]<0)
            {
                c.num[i]+=10;
                a.num[i+1]--;
            }
        }
        while(c.num[clen]==0)clen--;
        c.len=clen;
        return c;
    }
    bignum bigAdd(bignum a,bignum b)
    {
        bignum c;
        int clen=a.len;
        for(int i=1; i<=a.len+1; i++)
        {
            c.num[i]=a.num[i]+b.num[i];
            if(c.num[i]>=10)
            {
                c.num[i]-=10;
                a.num[i+1]++;
            }
    
        }
        if(c.num[clen+1])clen++;
        c.len=clen;
        return c;
    }
    bignum bigMultiply(bignum a,bignum b)
    {
        bignum c;
        int clen=a.len+b.len-1;
        for(int i=1; i<=a.len; i++)
            for(int j=1; j<=b.len; j++)
            {
                c.num[i+j-1]+=a.num[i]*b.num[j];
                if(c.num[i+j-1]>=10)
                {
                    c.num[i+j]+=c.num[i+j-1]/10;
                    c.num[i+j-1]%=10;
                }
            }
        if(c.num[clen+1])clen++;
        c.len=clen;
        return c;
    }

    调用:

    int main()
    {
        string num1,num2;
        cin>>num1>>num2;
        a.len=num1.length();
        b.len=num2.length();
        for(int i=0; i<a.len; i++)
        {
            a.num[a.len-i]=num1[i]-'0';
        }
        for(int i=0; i<b.len; i++)
        {
            b.num[b.len-i]=num2[i]-'0';
        }
        if(cmp(a,b))
        {
            c=bigAdd(a,b);
        }
        else
        {
            c=bigAdd(b,a);
        }
    
    //    if(cmp(a,b)){
    //        c=bigMinus(a,b)
    //    }else{
    //        printf("-");
    //        c=bigMinus(b,a);
    //    }
    
    //    c=bigMultiply(a,b);
        for(int i=c.len; i>0; i--)
        {
            cout<<c.num[i];
        }
    }

      

  • 相关阅读:
    【LeetCode】048. Rotate Image
    【LeetCode】036. Valid Sudoku
    【LeetCode】060. Permutation Sequence
    【LeetCode】001. Two Sum
    【LeetCode】128. Longest Consecutive Sequence
    【LeetCode】081. Search in Rotated Sorted Array II
    【LeetCode】033. Search in Rotated Sorted Array
    顺时针打印矩阵
    矩形覆盖
    二维数组中的查找
  • 原文地址:https://www.cnblogs.com/flipped/p/5005010.html
Copyright © 2011-2022 走看看