为防止广告,目前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;
}
个人工具