题意:求a^b-b^a次,100以内。大数的-和*的模拟,用的模板,注意该模板中间和结果都不能出现负数。
#include<iostream> #include<string> using namespace std; const int ten[4]={1,10,100,1000}; const int maxl=1000; struct bignum { int d[maxl]; bignum(string s) { int len=s.size(); d[0]=(len-1)/4+1; int i,j,k; for(i=1;i<maxl;i++)d[i]=0; for(i=len-1;i>=0;i--) { j=(len-i-1)/4+1; k=(len-i-1)%4; d[j]+=ten[k]*(s[i]-'0'); } while(d[0]>1&&d[d[0]]==0)--d[0]; } bignum() { *this=bignum(string("0")); } string tostring() { string s(""); int i,j,temp; for(i=3;i>=1;i--)if(d[d[0]]>=ten[i])break; temp=d[d[0]]; for(j=i;j>=0;j--) { s=s+(char)(temp/ten[j]+'0'); temp%=ten[j]; } for(i=d[0]-1;i>0;i--) { temp=d[i]; for(j=3;j>=0;--j) { s=s+(char)(temp/ten[j]+'0'); temp%=ten[j]; } } return s; } }zero("0"),d,temp,mid1[20]; bool operator < (const bignum &a ,const bignum &b) { if(a.d[0]!=b.d[0])return a.d[0]<b.d[0]; int i; for(i=a.d[0];i>0;i--)if(a.d[i]!=b.d[i])return a.d[i]<b.d[i]; return 0; } bignum operator - (const bignum &a ,const bignum &b) { bignum c; c.d[0]=a.d[0]; int i,x=0; for(i=1;i<=c.d[0];i++) { x=10000+a.d[i]-b.d[i]+x; c.d[i]=x%10000; x=x/10000-1; } while((c.d[0]>1)&&(c.d[c.d[0]]==0))--c.d[0]; return c; } bignum operator *(const bignum &a,const bignum &b) { bignum c; c.d[0]=a.d[0]+b.d[0]; int i,j,x; for(i=1;i<=a.d[0];i++) { x=0; for(j=1;j<=b.d[0];j++) { x=a.d[i]*b.d[j]+x+c.d[i+j-1]; c.d[i+j-1]=x%10000; x/=10000; } c.d[i+b.d[0]]=x; } while((c.d[0]>1)&&(c.d[c.d[0]]==0))--c.d[0]; return c; } string getstring(int a) { string ss; while(a!=0) { ss= char('0'+(a%10))+ss; a/=10; } return ss; } int main() { int aa,bb; cin>>aa>>bb; if(aa==bb) { cout<<0<<endl; return 0; } string ta=getstring(aa),tb=getstring(bb); bignum a(ta); bignum b(tb); // cout<<a.tostring(); // cout<<b.tostring()<<endl; bignum ans1("1"),ans2("1"); for(int i=0;i<bb;i++) { ans1=ans1*a; } // cout<<ans1.tostring()<<endl; for(int i=0;i<aa;i++) { ans2=ans2*b; } // cout<<ans2.tostring()<<endl; if(ans2<ans1) { bignum ans=ans1-ans2; cout<<ans.tostring()<<endl; } else { bignum ans=ans2-ans1; cout<<"-"<<ans.tostring()<<endl; } return 0; }