高精度 发表于 2019-04-03 | 阅读次数: 蒟蒻写了一个晚上的高精度(肝吐血) 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328#include<bits/stdc++.h>using namespace std;const int N=100025;struct dd{ int len,a[N]; void work() { while(len>1&&a[len]==0)len--; } void clear() { len=0; memset(a,0,sizeof(a)); } void swp() { for(register int i=1;i+i<=len;++i) { swap(a[i],a[len-i+1]); } } void read() { clear(); char ch=getchar(); while(ch<'0'||ch>'9') { ch=getchar(); } while(ch>='0'&&ch<='9') { a[++len]=ch-'0'; ch=getchar(); } swp(); work(); } void write() { work(); for(register int i=len;i>=1;--i) { putchar('0'+a[i]); } } bool operator < (const dd &nt) const { if (len<nt.len) return 1; if (len>nt.len) return 0; for (int i=len;i;i--) if (a[i]!=nt.a[i]) return a[i]<nt.a[i]; return 0; } bool operator > (const dd &nt) const { return nt<*this; } bool operator != (const dd &nt) const { return *this<nt || nt<*this; } bool operator == (const dd &nt) const { return !(*this!=nt); } bool operator >=(const dd &nt) const { if(nt<*this)return 1; else { if(nt==*this)return 1; else return 0; } } dd operator = (const int &nt) { len=0; int x=nt; while (x) { a[++len]=x%10; x/=10; } return *this; } dd operator = (const long long &nt) { len=0; long long x=nt; while (x) { a[++len]=x%10; x/=10; } return *this; } dd operator *(const int &nt) { dd p; p.clear(); int x=nt; while(x) { p.len++; x/=10; } p.len+=len; int l=1; while(p.a[l]+(a[l]*nt)>0||l<=p.len) { p.a[l+1]=(p.a[l]+(a[l]*nt))/10; p.a[l]=(p.a[l]+(a[l]*nt))%10; l++; } p.len=l-1; p.work(); return p; } dd operator * (const dd &nt) { dd p; p.clear(); p.len=len+nt.len; for(register int i=1;i<=len;++i) { for(register int j=1;j<=nt.len;++j) { p.a[i+j]+=(a[i]*nt.a[j])/10; p.a[i+j-1]+=(a[i]*nt.a[j])%10; } } int l=1; while(l<=p.len||p.a[l]>0) { p.a[l+1]+=p.a[l]/10; p.a[l]%=10; l++; } p.len=l-1; p.work(); return p; } dd operator -(const dd &nt) { dd p; p.clear(); for(register int i=1;i<=max(len,nt.len);++i) { if(a[i]-nt.a[i]+p.a[i]>=0)p.a[i]+=a[i]-nt.a[i]; else { p.a[i]=p.a[i]+a[i]-nt.a[i]+10; p.a[i+1]-=1; } p.len++; } p.work(); return p; } dd operator +(const dd &nt) { dd p; p.clear(); int l=1; while(p.a[l]+a[l]+nt.a[l]>0||l<=max(len,nt.len)) { p.a[l+1]+=(p.a[l]+a[l]+nt.a[l])/10; p.a[l]=(p.a[l]+a[l]+nt.a[l])%10; l++; } p.len=l-1; p.work(); return p; } dd operator /(const dd &nt) { dd yu; yu=*this; yu.len=len; dd p=nt; dd sh; sh.clear(); int num; int last=-1; while(1) { if(nt<yu) { p.clear(); for(register int i=1;i<=yu.len-nt.len;++i) { p.a[i]=0; } for(register int i=yu.len-nt.len+1,j=1;j<=nt.len;++i) { p.a[i]=nt.a[j]; j++; } p.len=yu.len; if(yu<p) { p.clear(); for(register int i=1;i<=yu.len-nt.len-1;++i) { p.a[i]=0; } for(register int i=yu.len-nt.len,j=1;j<=nt.len;++i) { p.a[i]=nt.a[j]; j++; } p.len=yu.len-1; } } else { if(yu<nt) { if(sh.len==0)sh.len=1; sh.work(); return sh; } if(yu==nt) { p.clear(); p=nt; } } yu=(yu-p); if(p.len==last) num++; if(p.len!=last)num=1,last=p.len; sh.len=max(sh.len,p.len-nt.len+1); sh.a[p.len-nt.len+1]=num; } } dd operator %(const dd &nt) { dd yu; yu=*this; yu.len=len; dd p=nt; dd sh; sh.clear(); int num; int last=len; while(1) { if(nt<yu) { p.clear(); for(register int i=1;i<=yu.len-nt.len;++i) { p.a[i]=0; } for(register int i=yu.len-nt.len+1,j=1;j<=nt.len;++i) { p.a[i]=nt.a[j]; j++; } p.len=yu.len; if(yu<p) { p.clear(); for(register int i=1;i<=yu.len-nt.len-1;++i) { p.a[i]=0; } for(register int i=yu.len-nt.len,j=1;j<=nt.len;++i) { p.a[i]=nt.a[j]; j++; } p.len=yu.len-1; } last=p.len; } else { if(yu<nt) { if(yu.len==0)yu.len=1; yu.work(); return yu; } if(yu==nt) { p.clear(); p=nt; } } yu=(yu-p); if(p.len==last) num++; if(p.len!=last)num=1,last=p.len; } } dd jie(const int &nt) { dd p; p.clear(); p=1; for(register int i=2;i<=nt;++i) { p=p*i; // p.write(); // puts(""); } return p; }}; dd b;dd c;int n;int main(){ cin>>n; if(n==0) { puts("0"); return 0; } dd a; a.clear(); // a=a.jie(n); for(register int i=1;i<=n;++i) { a=a+a.jie(i); } a.write();}