• 高精度(正整数的加、减、乘法)


    #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];
        }
    }

      

  • 相关阅读:
    Ansys经验之:杨氏模量的本质概念理解——仿真在线工作记录
    解决和根源:Unsolicited response received on idle HTTP channel starting with xxx
    版本控制之git
    爬虫数据解析
    爬虫Scrapy框架的初步使用
    爬虫scrapy的下载中间件
    爬虫scrapy的请求传参,POST请求和cookie问题
    爬虫requests模块
    已拦截载入自 xxx 的模块
    js的类调用
  • 原文地址:https://www.cnblogs.com/flipped/p/5005010.html
Copyright © 2020-2023  润新知