为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。
Sgu/112
来自NOCOW
< Sgu
简单的高精度.小心负数的输出.
//P*M #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const long long E8 = 100000000; int aa, bb, E[8], len, t, l, comp; char ch1, str1[10000]; struct bign{ int l; long long a[150]; bign(){ l = 0; a[0] = 0; } bign(int x){ l = 0; a[0] = 0; while(x > 0){a[l++] = x % E8; x = x / E8;} } void prntf(){ printf("%I64d", a[l-1]); for(int i = l-2; i >= 0; i--){ for(int j = 7; j >=0; j--){ printf("%I64d", (a[i] % (E[j]*10))/ E[j]); } } printf("\n"); } }; bign r(0), r1(0), r2(0),a, b; int com(bign& a, bign& b){ if(a.l < b.l){return -1;} if(a.l > b.l){return 1;} for(int i = a.l-1; i >=0; i--){ if(a.a[i] < b.a[i]){return -1;} if(a.a[i] > b.a[i]){return 1;} } return 0; } void minus(bign& a, bign& b, bign& c){ c.a[0] = 0; c.l = b.l; for(int i = 0; i < c.l; i++){ c.a[i]+=a.a[i]-b.a[i]; if(c.a[i] < 0){c.a[i]+=E8; c.a[i+1] = -1;}else{c.a[i+1] = 0;} c.a[i] = c.a[i] % E8; } for(int i = c.l; i < a.l; i++){ c.a[i]+=a.a[i]; if(c.a[i] < 0){c.a[i]+=E8; c.a[i+1] = -1;}else{c.a[i+1] = 0;} c.a[i] = c.a[i] % E8; } c.l = a.l; for(int i = c.l-1; i >= 0; i--){ if(c.a[i] == 0){c.l--;}else{break;} } return; } void multiply(bign& a, bign& b, bign& d){ memset(d.a, 0, sizeof(d.a)); for(int i = 0; i < b.l; i++){ for(int j = 0; j < a.l; j++){ d.a[i+j] += b.a[i]*a.a[j]; d.a[i+j+1] += d.a[i+j] / E8; d.a[i+j] = d.a[i+j] % E8; } } if(d.a[a.l+b.l-1] != 0){d.l = a.l+b.l;}else{d.l = a.l+b.l-1;} return; } int main(){ freopen("sgu112.in", "r", stdin); freopen("sgu112.out", "w", stdout); scanf("%d %d", &aa, &bb); E[0] = 1; for(int i = 1; i < 8; i++){E[i] = E[i-1]*10;} a = bign(aa); r = bign(1); b = bign(bb); for(int i = 1; i <= aa; i++){multiply(r, b, r1); r = r1;} r2 = bign(1); for(int i = 1; i <= bb; i++){multiply(r2, a, r1); r2 = r1;} comp = com(r, r2); if(comp > 0){minus(r, r2, r1); printf("-"); r1.prntf();}else{minus(r2, r, r1); r1.prntf();} fclose(stdin); fclose(stdout); return 0; }