• 【考前复习__各类模板之高精度】


    一、高精度数的输入输出

        char ci[maxn],cj[maxn];
        scanf("%s",ci+1);
        scanf("%s",cj+1);
        int len1=strlen(ci+1);
        int len2=strlen(cj+1);
        a.w[0]=len1;
        for (int i=1;i<=len1;i++)
          a.w[i]=ci[len1-i+1]-'0';//反着记录 
        b.w[0]=len2;
        for (int i=1;i<=len2;i++)
          b.w[i]=cj[len2-i+1]-'0';

    二、高精度+高精度

    hp jia(hp a,hp b)
    {
        hp c;
        if (a.w[0]>b.w[0]) c.w[0]=a.w[0]+1;
        else c.w[0]=b.w[0]+1;
        for (int i=1;i<=c.w[0];i++) c.w[i]=0;
        for (int i=1;i<c.w[0];i++)//< not <=
        {
            c.w[i]+=a.w[i]+b.w[i];//+=
            c.w[i+1]+=c.w[i]/10;//+=
            c.w[i]=c.w[i]%10;
        }
        while (c.w[0]!=0&&c.w[c.w[0]]==0) c.w[0]--;
        return c;
    }

    三、高精度-高精度

    1、判断正负

    bool bj(hp a,hp b)
    {
        if (a.w[0]<b.w[0]) return false;
        for (int i=1;i<=a.w[0];i++)
          if (b.w[0]>a.w[0]) return false;
        return true;
    }
    if (bj(a,b)) x=jian(a,b);
        else {
            cout<<"-";
            x=jian(b,a);
        }

    2、减法

    hp jian(hp a,hp b)
    {
        hp c;
        c.w[0]=a.w[0];
        for(int i=1;i<=c.w[0];i++) c.w[i]=0;
        for (int i=1;i<=c.w[0];i++)
        {
            if (a.w[i]<b.w[i]){
                a.w[i]+=10;
                a.w[i+1]--;
            }
            c.w[i]=a.w[i]-b.w[i];
        }
        while (c.w[0]>0&&c.w[c.w[0]]==0) c.w[0]--;
        return c;
    }

    三、高精度*高精度

    hp cheng(hp a,hp b)
    {
        hp c;
        c.w[0]=a.w[0]+b.w[0];
        for (int i=1;i<=c.w[0];i++) c.w[i]=0;
        for (int i=1;i<=a.w[0];i++)
         for (int j=1;j<=b.w[0];j++)
         {
             c.w[i+j-1]+=a.w[i]*b.w[j];
             c.w[i+j]+=c.w[i+j-1]/10;
             c.w[i+j-1]=c.w[i+j-1]%10;
         }
        while (c.w[0]>=1&&c.w[c.w[0]]==0) c.w[0]--;
        return c;
    }

    四、高精度/高精度

    1、按位相减 之 numcpy:用456/12,在第一位4的时候/120

    void numcpy(hp &t,int id)
    {
        for (int i=1;i<=b.w[0];i++)
          t.w[i+id-1]=b.w[i];
        t.w[0]=b.w[0]+id-1;
    }

    2、按位相减:相应位数商+1

    hp chu(hp a,hp b)
    {
        hp c;
        c.w[0]=a.w[0]-b.w[0]+1;
        for (int i=1;i<=c.w[0];i++) c.w[i]=0;
        for (int i=c.w[0];i>=1;i--)
        {
            hp tmp;
            tmp.w[0]=b.w[0]+i-1;
            for (int j=1;j<=tmp.w[0];j++) tmp.w[j]=0;
            numcpy(tmp,i);
            while (bj(a,tmp)) {
                c.w[i]++;jian(a,tmp);
            }
        }
        while (c.w[0]>=1&&c.w[c.w[0]]==0) c.w[0]--;
        return c;
    }

    3、减法的过程(与高精减高精不同,要修改a)

    bool bj(hp a,hp b)
    {
        if (a.w[0]<b.w[0]) return false;
        else if (a.w[0]>b.w[0]) return true;
        int cnt=0;
        for (int i=a.w[0];i>=1;i--)//顺序 
          {
              if (a.w[i]>b.w[i]) return true;
              if (a.w[i]<b.w[i]) return false;
          }
        return true;
    }
    void jian(hp & a,hp b)
    {
        for (int i=1;i<=b.w[0];i++)//b.w[0]
        {
            if(a.w[i]<b.w[i]) 
            {
                a.w[i+1]--;//a.w[i]-- not b
                a.w[i]+=10;
            }    
            a.w[i]-=b.w[i];
        }
        while (a.w[0]>=1&&a.w[a.w[0]]==0) a.w[0]--;//修改a 
    }
  • 相关阅读:
    【NIO】IO与NIO的区别
    【在线工具】java开发常用在线工具
    【JVM】符号引用和直接引用
    【多线程】公平锁/非公平锁、乐观锁/悲观锁
    【Jenkins、sonar】
    开源软件记录
    Git Flow
    CF1324A Yet Another Tetris Problem 题解
    洛谷 P1199 三国游戏 题解
    CF33C Wonderful Randomized Sum 题解
  • 原文地址:https://www.cnblogs.com/lx0319/p/6075701.html
Copyright © 2020-2023  润新知