• (待补充)pat知识点复习--day77


    高精度专题

    高精度加减乘

    • 需要注意区分len和c.len
    • temp要注意及时恢复成零,尤其是外圈循环
    • 内层temp修改的时候避免影响到本轮
    • 注意出现多余的0的判断是c.d[c.len-1]balabala,使用c.d[c.len]不可哦,范围是0-c.len01
    • 并且删除掉多余的0的时候要至少保留一位,所以c.len>=2是边界条件
    • 减法修改顺序,cmp自己写,遇到了添加减号。
    • 高精度加法暂时只适用于非负数

    高精度减法

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    struct bign
    {
        int d[11000];
        int len;//len是长度,存0~len-1
        bign()
        {
            memset(d,0,sizeof(d));
            len=0;
        }
    };
    bool cmp(bign a,bign b)
    {
        if(a.len!=b.len)
        {
            return a.len>b.len;
        }
        int len=a.len;
        for(int i=len-1;i>=0;i--)
        {
            if(a.d[i]!=b.d[i])
                return a.d[i]>b.d[i];
        }
        return true;
    }
    bign add(bign a,bign b)
    {
        bign c;
        int temp=0;
        int len=max(a.len,b.len);
        for(int i=0;i<=len-1;i++)
        {
            c.d[c.len++]=(a.d[i]+b.d[i]+temp)%10;
            temp=(a.d[i]+b.d[i]+temp)/10;
        }
        if(temp)
        {
            c.d[c.len++]=1;
        }
        return c;
    }
    bign sub(bign a,bign b)//规定a-b大于等于0了
    {
        if(cmp(a,b)==false)
        {
            bign temp=a;
            a=b;
            b=temp;
        }//强制大减小
        int temp=0;
        bign c;
        int len=max(a.len,b.len);
        for(int i=0;i<=len-1;i++)
        {
            c.d[i]=a.d[i]-b.d[i]+temp;
            temp=0;
            if(c.d[i]<0)
            {
                c.d[i]=c.d[i]+10;
                temp=-1;
            }
        }
        c.len=len;
        while(c.d[c.len-1]==0 && c.len>=2) c.len--;
        return c;
    }
    bign multi(bign a,bign b)
    {
        int temp=0;
        bign c;
        for(int i=0;i<=a.len-1;i++)
        {
            for(int j=0;j<=b.len-1;j++)
            {
                c.d[i+j]=c.d[i+j]+a.d[i]*b.d[j]+temp;
                temp=c.d[i+j]/10;
                c.d[i+j]=c.d[i+j]%10;
            }
            c.d[i+b.len]=c.d[i+b.len]+temp;
            temp=0;//一定要写
        }
        c.len=a.len+b.len;
        while(c.d[c.len-1]==0 && c.len>=2) c.len--;
        return c;
    }
    bign change(char str[])
    {
        bign c;
        int len=strlen(str);
        for(int i=len-1;i>=0;i--)
            c.d[len-1-i]=str[i]-'0';
        c.len=len;
        return c;
    }
    void print(bign a)
    {
        for(int i=a.len-1;i>=0;i--)
            printf("%d",a.d[i]);
        printf("
    ");
        return ;
    }
    int main()
    {
        bign a;
        bign b;
        char str1[11000];
        char str2[11000];
        scanf("%s",str1);
        scanf("%s",str2);
        a=change(str1);
        b=change(str2);
       // bign ans=add(a,b);
        bign ans1=sub(a,b);
        //bign ans2=multi(a,b);
        //print(a);
        //print(b);
       // print(ans);
       if(!cmp(a,b)) printf("-");
        print(ans1);
        //print(ans2);
        return 0;
    }
    View Code

     高精度加法

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    struct bign
    {
        int d[1000];
        int len;//len是长度,存0~len-1
        bign()
        {
            memset(d,0,sizeof(d));
            len=0;
        }
    };
    bool cmp(bign a,bign b)
    {
        if(a.len!=b.len)
        {
            return a.len>b.len;
        }
        int len=a.len;
        for(int i=len-1;i>=0;i--)
        {
            if(a.d[i]!=b.d[i])
                return a.d[i]>b.d[i];
        }
        return true;
    }
    bign add(bign a,bign b)
    {
        bign c;
        int temp=0;
        int len=max(a.len,b.len);
        for(int i=0;i<=len-1;i++)
        {
            c.d[c.len++]=(a.d[i]+b.d[i]+temp)%10;
            temp=(a.d[i]+b.d[i]+temp)/10;
        }
        if(temp)
        {
            c.d[c.len++]=1;
        }
        return c;
    }
    bign sub(bign a,bign b)//规定a-b大于等于0了
    {
        if(cmp(a,b)==false)
        {
            bign temp=a;
            a=b;
            b=temp;
        }//强制大减小
        int temp=0;
        bign c;
        int len=max(a.len,b.len);
        for(int i=0;i<=len-1;i++)
        {
            c.d[i]=a.d[i]-b.d[i]+temp;
            temp=0;
            if(c.d[i]<0)
            {
                c.d[i]=c.d[i]+10;
                temp=-1;
            }
        }
        c.len=len;
        while(c.d[c.len-1]==0 && c.len>=2) c.len--;
        return c;
    }
    bign multi(bign a,bign b)
    {
        int temp=0;
        bign c;
        for(int i=0;i<=a.len-1;i++)
        {
            for(int j=0;j<=b.len-1;j++)
            {
                c.d[i+j]=c.d[i+j]+a.d[i]*b.d[j]+temp;
                temp=c.d[i+j]/10;
                c.d[i+j]=c.d[i+j]%10;
            }
            c.d[i+b.len]=c.d[i+b.len]+temp;
            temp=0;//一定要写
        }
        c.len=a.len+b.len;
        while(c.d[c.len-1]==0 && c.len>=2) c.len--;
        return c;
    }
    bign change(char str[])
    {
        bign c;
        int len=strlen(str);
        for(int i=len-1;i>=0;i--)
            c.d[len-1-i]=str[i]-'0';
        c.len=len;
        return c;
    }
    void print(bign a)
    {
        for(int i=a.len-1;i>=0;i--)
            printf("%d",a.d[i]);
        printf("
    ");
        return ;
    }
    int main()
    {
        bign a;
        bign b;
        char str1[1000];
        char str2[1000];
        scanf("%s",str1);
        scanf("%s",str2);
        a=change(str1);
        b=change(str2);
        bign ans=add(a,b);
        //bign ans1=sub(a,b);
        //bign ans2=multi(a,b);
        //print(a);
        //print(b);
        print(ans);
        //print(ans1);
        //print(ans2);
        return 0;
    }
    View Code

    写了高精度加减乘,暂时不会高精度除高精度,回头补。加减已验证,乘暂时没验证

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    struct bign
    {
        int d[1000];
        int len;//len是长度,存0~len-1
        bign()
        {
            memset(d,0,sizeof(d));
            len=0;
        }
    };
    bool cmp(bign a,bign b)
    {
        if(a.len!=b.len)
        {
            return a.len>b.len;
        }
        int len=a.len;
        for(int i=len-1;i>=0;i--)
        {
            if(a.d[i]!=b.d[i])
                return a.d[i]>b.d[i];
        }
        return true;
    }
    bign add(bign a,bign b)
    {
        bign c;
        int temp=0;
        int len=max(a.len,b.len);
        for(int i=0;i<=len-1;i++)
        {
            c.d[c.len++]=(a.d[i]+b.d[i]+temp)%10;
            temp=(a.d[i]+b.d[i]+temp)/10;
        }
        if(temp)
        {
            c.d[c.len++]=1;
        }
        return c;
    }
    bign sub(bign a,bign b)//规定a-b大于等于0了
    {
        if(cmp(a,b)==false)
        {
            bign temp=a;
            a=b;
            b=temp;
        }//强制大减小
        int temp=0;
        bign c;
        int len=max(a.len,b.len);
        for(int i=0;i<=len-1;i++)
        {
            c.d[i]=a.d[i]-b.d[i]+temp;
            temp=0;
            if(c.d[i]<0)
            {
                c.d[i]=c.d[i]+10;
                temp=-1;
            }
        }
        c.len=len;
        while(c.d[c.len-1]==0 && c.len>=2) c.len--;
        return c;
    }
    bign multi(bign a,bign b)
    {
        int temp=0;
        bign c;
        for(int i=0;i<=a.len-1;i++)
        {
            for(int j=0;j<=b.len-1;j++)
            {
                c.d[i+j]=c.d[i+j]+a.d[i]*b.d[j]+temp;
                temp=c.d[i+j]/10;
                c.d[i+j]=c.d[i+j]%10;
            }
            c.d[i+b.len]=c.d[i+b.len]+temp;
            temp=0;//一定要写
        }
        c.len=a.len+b.len;
        while(c.d[c.len-1]==0 && c.len>=2) c.len--;
        return c;
    }
    bign change(char str[])
    {
        bign c;
        int len=strlen(str);
        for(int i=len-1;i>=0;i--)
            c.d[len-1-i]=str[i]-'0';
        c.len=len;
        return c;
    }
    void print(bign a)
    {
        for(int i=a.len-1;i>=0;i--)
            printf("%d",a.d[i]);
        printf("
    ");
        return ;
    }
    int main()
    {
        bign a;
        bign b;
        char str1[1000];
        char str2[1000];
        scanf("%s",str1);
        scanf("%s",str2);
        a=change(str1);
        b=change(str2);
        bign ans=add(a,b);
        //bign ans1=sub(a,b);
        //bign ans2=multi(a,b);
        //print(a);
        //print(b);
        print(ans);
        //print(ans1);
        //print(ans2);
        return 0;
    }
    View Code
    时间才能证明一切,选好了就尽力去做吧!
  • 相关阅读:
    MySQL学习笔记
    为什么使用多态?实现多态的有哪些方式
    C++中派生类使用基类成员的问题
    实现Modbus ASCII多主站应用
    PHP第四天 函数引用传值
    Webpack 快速上手(下)
    Java---23种设计模式(九)------组合模式
    【笔记】Linux就该这么学-第六课第四章
    Node.js HTTPS
    Node.js Smalloc
  • 原文地址:https://www.cnblogs.com/tingxilin/p/12284483.html
Copyright © 2020-2023  润新知