以前写高精度基本都是抄别人的……这次要改变一下了……
现在的高精度模板还是很简陋的,只支持高精加,减,乘,高精除低精,高精模低精,高精快速幂,高精比较大小,没了。
或许以后会不定期更新一下……毕竟这个还是比较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; }
原文地址:https://www.cnblogs.com/captain1/p/9873532.html
时间: 2024-10-27 19:12:32