高精度压位模板

xiaoxiao2021-02-27  246

#include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<algorithm> #include<queue> #define inf 1000000000] #define p 9 //注意乘法压位过大 using namespace std; void _scanf(int &x){ char ch=getchar(); bool f=0; x=0; while(!isdigit(ch)) { if(ch=='-') f=1; ch=getchar(); } while(isdigit(ch)) x=10*x+ch-'0',ch=getchar(); if(f) x=-x; } void _scanf(int &a,int &b){ _scanf(a); _scanf(b); } struct bign{ int z[25],len; bign(){ memset(z,0,sizeof(z)); len=0; } bign (int x){ *this=x; } bign operator =(int x){ char s[25]; sprintf(s,"%d",x); *this=s; } bign operator =(char *s){ int len=strlen(s); int cur=0; bign a; char w[25]; while(len>0){ while(len>=p){ strcpy(w,s+len-p); a.z[cur++]=atoi(w); len-=p; } if(len>0){ strcpy(w,s); w[len]='\0'; a.z[cur++]=atoi(w); len=0; } } a.len=cur; *this=a; } friend bign operator +(bign a,bign b){ bign c; int len=max(a.len,b.len)+1; for(int i=0;i<=len-1;i++){ c.z[i]=a.z[i]+b.z[i]; } for(int i=0;i<=len-1;i++) c.z[i+1]+=c.z[i]/1000000000,c.z[i]%=1000000000; while(c.z[len-1]==0&&len>1) len--; c.len=len; return c; } }; void bignout(bign a){ int len=a.len; printf("%d",a.z[len-1]); for(int i=len-2;i>=0;i--) printf("%0*d",p,a.z[i]); }
转载请注明原文地址: https://www.6miu.com/read-10593.html

最新回复(0)