1. 程式人生 > >高精度模板(不定時更新)

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

void 支持 rev == memset spa -s -- code

以前寫高精度基本都是抄別人的……這次要改變一下了……

現在的高精度模板還是很簡陋的,只支持高精加,減,乘,高精除低精,高精模低精,高精快速冪,高精比較大小,沒了。

或許以後會不定期更新一下……畢竟這個還是比較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 %= mod; 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; }

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