zoukankan      html  css  js  c++  java
  • 高精度模板(不定时更新)

    以前写高精度基本都是抄别人的……这次要改变一下了……

    现在的高精度模板还是很简陋的,只支持高精加,减,乘,高精除低精,高精模低精,高精快速幂,高精比较大小,没了。

    或许以后会不定期更新一下……毕竟这个还是比较ca的。

    直接一股脑全贴上来吧……注意所有的元素都是倒叙存储的,想要改成压位的很简单,只要改一下模数,改一下输入输出即可。

    也可以支持不同进制的运算,都是很好改的。

    struct big
    {
       int f[M],len;
       big()
       {
          memset(f,0,sizeof(f)),len = 0;
       }
       big(char *s)
       {
          memset(f,0,sizeof(f)),len = 0;
          int l = strlen(s);
          per(i,l-1,0)
          {
         if(s[i] >= '0' && s[i] <= '9')    f[len++] = s[i] - '0';
         else if(s[i] >= 'A' && s[i] <= 'Z') f[len++] = s[i] - 'A' + 10;
          }
          while(!f[len] && len > 0) len--;
       }
       big change(int k)
       {
          big a;
          while(k) a.f[a.len++] = k % 10,k /= 10;
          while(!a.f[a.len] && a.len > 0) a.len--;
          return a;
       }
       void modi(int k)
       {
          while(k) f[len++] = k % 10,k /= 10;
          while(!f[len] && len > 0) len--;
       }
       big operator + (const big &g) const
       {
          big c;
          c.len = max(len,g.len) + 1;
          rep(i,0,c.len) c.f[i] += f[i] + g.f[i];
          rep(i,0,c.len) c.f[i+1] += c.f[i] / B,c.f[i] %= B;
          while(!c.f[c.len] && c.len > 0) c.len--;
          return c;
       }
       big operator - (const big &g) const
       {
          big c;
          c.len = max(len,g.len);
          rep(i,0,c.len) c.f[i] = f[i] - g.f[i];
          rep(i,0,c.len) if(c.f[i] < 0) c.f[i] += 10,c.f[i+1]--;
          while(!c.f[c.len] && c.len > 0) c.len--;
          return c;
       }
       big operator * (const big &g) const
       {
          big c;
          c.len = len + g.len + 1;
          //printf("!%d %d %d
    ",len,g.len,c.len);
          rep(i,0,len)
         rep(j,0,g.len)
         c.f[i+j] += f[i] * g.f[j];
          rep(i,0,c.len-1) c.f[i+1] += c.f[i] / 10,c.f[i] %= 10;
          while(!c.f[c.len] && c.len > 0) c.len--;
          return c;
       }
       big operator / (const int &g)
       {
          big c;
          int cur = 0;
          per(i,len,0) cur *= 10,cur += f[i],c.f[c.len++] = cur / g,cur %= g;
          reverse(c.f,c.f + c.len);
          while(!c.f[c.len] && c.len > 0) c.len--;
          return c;
       }
       int operator % (const int &g)
       {
          int cur = 0;
          per(i,len,0) cur *= 10,cur += f[i],cur %= g;
          return cur;
       }
       bool operator > (const big &g)
       {
          if(len != g.len) return len > g.len;
          per(i,len,0)
          {
         if(f[i] == g.f[i]) continue;
         return f[i] > g.f[i];
          }
          return 0;
       }  
       void print()
       {
          //per(i,len,0) printf("%d ",f[i]);
          per(i,len,0) (f[i] >= 10) ? printf("%c",f[i] - 10 + 'A') : printf("%d",f[i]);
          enter;
       }
    };
    
    big bmax(const big &a,const big &b)
    {
       if(a.len != b.len) return a.len > b.len ? a : b;
       per(i,a.len,0)
       {
          if(a.f[i] == b.f[i]) continue;
          else return a.f[i] > b.f[i] ? a : b;
       }
       return a;
    }
  • 相关阅读:
    如何分配资源和管理资源
    让Project把周六和周日也计算工期
    Project设置子任务
    pytest-配置文件
    pytest-fixture
    pytest-标记
    pytest-断言
    pytest-参数化
    pytest入门
    maven-插件
  • 原文地址:https://www.cnblogs.com/captain1/p/9873532.html
Copyright © 2011-2022 走看看