高精度模板(不定时更新)

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

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

或许以后会不定期更新一下……毕竟这个还是比较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\n",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;
}

 

posted @ 2018-10-29 21:46  CaptainLi  阅读(184)  评论(0编辑  收藏  举报