[板子]高精(無符號)
阿新 • • 發佈:2018-11-08
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #define ll long long using namespace std; struct Bignum{ #define Dignum 1000+5 int num[Dignum]; #undef Dignum }; Bignum b_trans(char *p){ int len=strlen(p); Bignum ans; memset(ans.num,0,sizeof(ans.num)); ans.num[0]=len; for(int i=len-1;i>=0;--i){ ans.num[len-i]=p[i]-'0'; } return ans; } void b_output(Bignum x){ for(int i=x.num[0];i;--i){ printf("%c",x.num[i]+'0'); } return; } int b_cmp(Bignum a,Bignum b){ if(a.num[0]>b.num[0]) return 1; if(a.num[0]<b.num[0]) return -1; for(int i=a.num[0];i;--i){ if(a.num[i]>b.num[i]) return 1; if(a.num[i]<b.num[i]) return -1; } return 0; } Bignum b_add(Bignum a,Bignum b){ Bignum ans; memset(ans.num,0,sizeof(ans.num)); ans.num[0]=max(a.num[0],b.num[0]); int add=0; for(int i=1;i<=ans.num[0];++i){ ans.num[i]+=a.num[i]+b.num[i]+add; add=ans.num[i]/10; ans.num[i]%=10; } while(add){ ++ans.num[0]; ans.num[ans.num[0]]=add%10; add/=10; } return ans; } Bignum b_jian(Bignum a,Bignum b){ Bignum ans; memset(ans.num,0,sizeof(ans.num)); if(!b_cmp(a,b)){ ans.num[0]=1; ans.num[1]=0; return ans; } ans.num[0]=a.num[0]; int add=1; for(int i=1;i<=ans.num[0];++i){ ans.num[i]=10+a.num[i]-b.num[i]+add-1; add=ans.num[i]/10; ans.num[i]%=10; } while(!ans.num[ans.num[0]]){ --ans.num[0]; } return ans; } Bignum b_mut(Bignum a,Bignum b){ Bignum ans; memset(ans.num,0,sizeof(ans.num)); for(int i=1;i<=a.num[0];++i){ for(int j=1;j<=b.num[0];++j){ ans.num[i+j-1]+=a.num[i]*b.num[j]; } } ans.num[0]=a.num[0]+b.num[0]-1; int add=0; for(int i=1;i<=ans.num[0];++i){ ans.num[i]+=add; add=ans.num[i]/10; ans.num[i]%=10; } while(add){ ++ans.num[0]; ans.num[ans.num[0]]=add%10; add/=10; } while(!ans.num[ans.num[0]] && ans.num[0]>1){ --ans.num[0]; } //if(ans.num[0]==0) ans.num[0]=1; return ans; } int main(){ //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); char a[10000],b[10000]; scanf("%s",a); scanf("%s",b); Bignum x=b_trans(a); Bignum y=b_trans(b); Bignum z=b_mut(x,y); b_output(z); return 0; }