SGU112

题意:求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;
}


posted @ 2014-04-03 09:18  天羽屠龙舞  阅读(127)  评论(0编辑  收藏  举报