【高精度模板】【高精加减乘没有除】

来源:互联网 发布:vue.js 编辑:程序博客网 时间:2024/04/30 19:54

其实我从小就不喜欢高精度……

Code:

#include<bits/stdc++.h>using namespace std;const int maxn=1e3+10;typedef long long LL;struct HP{int len,s[maxn],f;HP(){clear();}void clear(){memset(s,0,sizeof(s));len=1;f=1;}HP operator=(const char *num){if(*num=='-')f=-1;while(*num=='0'||*num=='-')num++;len=strlen(num);if(!len){s[len++]=0;return *this;}for(int i=0;i<len;i++)s[i]=num[len-i-1]-'0';return *this;}HP operator=(const int num){char c[20];sprintf(c,"%d",num);return *this=c;}HP operator+(const HP &b)const{HP c;c.len=0;for(int i=0,g=0;g||i<max(len,b.len);i++){int x=g;if(i<len)x+=s[i];if(i<b.len)x+=b.s[i];c.s[c.len++]=x%10;g=x/10;}return c;}    HP operator-(HP b){        HP c;c.len=0;          if(*this<b){        c=b-*this;c.f=-1;return c;        }for(int i=0,g=0;i<len;i++){              int x=s[i]-g;              if(i<b.len)x-=b.s[i];              if(x>=0)g=0;              else{                  g=1;x+=10;              }c.s[c.len++]=x;          }c.clean();          return c;      }      HP operator*(const HP &b)const{HP c;c.len=len+b.len;c.f=((f==-1)^(b.f==-1))?-1:1;for(int i=0;i<len;i++)for(int j=0;j<b.len;j++)c.s[i+j]+=s[i]*b.s[j];for(int i=0;i<c.len;i++){c.s[i+1]+=c.s[i]/10;c.s[i]%=10;}c.clean();        return c;  }bool operator<(const HP &b)const{        if(len!=b.len)return (len<b.len)^(f==-1);          for(int i=len-1;i>=0;i--)            if(s[i]!=b.s[i])return (s[i]<b.s[i])^(f==-1);          return 0^(f==-1);  }bool operator==(const HP &b)const{if(len!=b.len||f!=b.f)return false;for(int i=0;i<len;i++)if(s[i]!=b.s[i])return false;return true;}void clean(){while(len>1&&s[len-1]==0)len--;if(len==1&&s[0]==0)f=1;}void print(){if(f==-1)putchar('-');for(int i=len-1;i>=0;i--)printf("%d",s[i]);}int toint(){int res=0;for(int i=0;i<len;i++)res=res*10+s[i];return res;}LL toLL(){LL res=0;for(int i=0;i<len;i++)res=res*10+s[i];return res;}};int main(){char s1[maxn],s2[maxn];scanf("%s%s",s1,s2);HP a,b;a=s1;b=s2;(a*b).print();return 0;}


0 0