• hdu 1063 Exponentiation(大数模版题)


    求浮点数的幂(0<mi<=25),整数部分为0时,0不输出;整数部分无前缀0,小数部分无后缀0

    特殊的样例:

    0 :

    00.00  12

    .000  12 

    前缀0: 

    001.10  12

    001  12

    后缀0: 

    0.0100  12 

    用大数模版。将浮点数转换整数,记录小数点位置,得到运算结果再将大数转换成字符串处理输出。

    附大牛的模版

    http://blog.csdn.net/hackbuteer1/article/details/6595881 

    http://blog.csdn.net/Hackbuteer1/article/details/6595901 

      1 #include<iostream>
      2 #include<string>
      3 #include <cstring>
      4 #include<iomanip>
      5 #include<algorithm>
      6 using namespace std;
      7 
      8 #define MAXN 9999
      9 #define MAXSIZE 10
     10 #define DLEN 4
     11 
     12 class BigNum
     13 {
     14 private:
     15     int a[500];    //可以控制大数的位数
     16     int len;       //大数长度
     17 public:
     18     BigNum(){ len = 1;memset(a,0,sizeof(a)); }   //构造函数
     19     BigNum(const int);       //将一个int类型的变量转化为大数
     20     BigNum(const char*);     //将一个字符串类型的变量转化为大数
     21     BigNum(const BigNum &);  //拷贝构造函数
     22     BigNum &operator=(const BigNum &);   //重载赋值运算符,大数之间进行赋值运算
     23 
     24     friend istream& operator>>(istream&,  BigNum&);   //重载输入运算符
     25     friend ostream& operator<<(ostream&,  BigNum&);   //重载输出运算符
     26 
     27     BigNum operator+(const BigNum &) const;   //重载加法运算符,两个大数之间的相加运算
     28     BigNum operator-(const BigNum &) const;   //重载减法运算符,两个大数之间的相减运算
     29     BigNum operator*(const BigNum &) const;   //重载乘法运算符,两个大数之间的相乘运算
     30     BigNum operator/(const int   &) const;    //重载除法运算符,大数对一个整数进行相除运算
     31 
     32     BigNum operator^(const int  &) const;    //大数的n次方运算
     33     int    operator%(const int  &) const;    //大数对一个int类型的变量进行取模运算
     34     bool   operator>(const BigNum & T)const;   //大数和另一个大数的大小比较
     35     bool   operator>(const int & t)const;      //大数和一个int类型的变量的大小比较
     36 
     37     void print();       //输出大数
     38     char* tochar(char*);
     39 };
     40 BigNum::BigNum(const int b)     //将一个int类型的变量转化为大数
     41 {
     42     int c,d = b;
     43     len = 0;
     44     memset(a,0,sizeof(a));
     45     while(d > MAXN)
     46     {
     47         c = d - (d / (MAXN + 1)) * (MAXN + 1);
     48         d = d / (MAXN + 1);
     49         a[len++] = c;
     50     }
     51     a[len++] = d;
     52 }
     53 BigNum::BigNum(const char*s)     //将一个字符串类型的变量转化为大数
     54 {
     55     int t,k,index,l,i;
     56     memset(a,0,sizeof(a));
     57     l=strlen(s);
     58     len=l/DLEN;
     59     if(l%DLEN)
     60         len++;
     61     index=0;
     62     for(i=l-1;i>=0;i-=DLEN)
     63     {
     64         t=0;
     65         k=i-DLEN+1;
     66         if(k<0)
     67             k=0;
     68         for(int j=k;j<=i;j++)
     69             t=t*10+s[j]-'0';
     70         a[index++]=t;
     71     }
     72 }
     73 BigNum::BigNum(const BigNum & T) : len(T.len)  //拷贝构造函数
     74 {
     75     int i;
     76     memset(a,0,sizeof(a));
     77     for(i = 0 ; i < len ; i++)
     78         a[i] = T.a[i];
     79 }
     80 BigNum & BigNum::operator=(const BigNum & n)   //重载赋值运算符,大数之间进行赋值运算
     81 {
     82     int i;
     83     len = n.len;
     84     memset(a,0,sizeof(a));
     85     for(i = 0 ; i < len ; i++)
     86         a[i] = n.a[i];
     87     return *this;
     88 }
     89 istream& operator>>(istream & in,  BigNum & b)   //重载输入运算符
     90 {
     91     char ch[MAXSIZE*4];
     92     int i = -1;
     93     in>>ch;
     94     int l=strlen(ch);
     95     int count=0,sum=0;
     96     for(i=l-1;i>=0;)
     97     {
     98         sum = 0;
     99         int t=1;
    100         for(int j=0;j<4&&i>=0;j++,i--,t*=10)
    101         {
    102             sum+=(ch[i]-'0')*t;
    103         }
    104         b.a[count]=sum;
    105         count++;
    106     }
    107     b.len =count++;
    108     return in;
    109 
    110 }
    111 ostream& operator<<(ostream& out,  BigNum& b)   //重载输出运算符
    112 {
    113     int i;
    114     cout << b.a[b.len - 1];
    115     for(i = b.len - 2 ; i >= 0 ; i--)
    116     {
    117         cout.width(DLEN);
    118         cout.fill('0');
    119         cout << b.a[i];
    120     }
    121     return out;
    122 }
    123 
    124 BigNum BigNum::operator+(const BigNum & T) const   //两个大数之间的相加运算
    125 {
    126     BigNum t(*this);
    127     int i,big;      //位数
    128     big = T.len > len ? T.len : len;
    129     for(i = 0 ; i < big ; i++)
    130     {
    131         t.a[i] +=T.a[i];
    132         if(t.a[i] > MAXN)
    133         {
    134             t.a[i + 1]++;
    135             t.a[i] -=MAXN+1;
    136         }
    137     }
    138     if(t.a[big] != 0)
    139         t.len = big + 1;
    140     else
    141         t.len = big;
    142     return t;
    143 }
    144 BigNum BigNum::operator-(const BigNum & T) const   //两个大数之间的相减运算
    145 {
    146     int i,j,big;
    147     bool flag;
    148     BigNum t1,t2;
    149     if(*this>T)
    150     {
    151         t1=*this;
    152         t2=T;
    153         flag=0;
    154     }
    155     else
    156     {
    157         t1=T;
    158         t2=*this;
    159         flag=1;
    160     }
    161     big=t1.len;
    162     for(i = 0 ; i < big ; i++)
    163     {
    164         if(t1.a[i] < t2.a[i])
    165         {
    166             j = i + 1;
    167             while(t1.a[j] == 0)
    168                 j++;
    169             t1.a[j--]--;
    170             while(j > i)
    171                 t1.a[j--] += MAXN;
    172             t1.a[i] += MAXN + 1 - t2.a[i];
    173         }
    174         else
    175             t1.a[i] -= t2.a[i];
    176     }
    177     t1.len = big;
    178     while(t1.a[len - 1] == 0 && t1.len > 1)
    179     {
    180         t1.len--;
    181         big--;
    182     }
    183     if(flag)
    184         t1.a[big-1]=0-t1.a[big-1];
    185     return t1;
    186 }
    187 
    188 BigNum BigNum::operator*(const BigNum & T) const   //两个大数之间的相乘运算
    189 {
    190     BigNum ret;
    191     int i,j,up;
    192     int temp,temp1;
    193     for(i = 0 ; i < len ; i++)
    194     {
    195         up = 0;
    196         for(j = 0 ; j < T.len ; j++)
    197         {
    198             temp = a[i] * T.a[j] + ret.a[i + j] + up;
    199             if(temp > MAXN)
    200             {
    201                 temp1 = temp - temp / (MAXN + 1) * (MAXN + 1);
    202                 up = temp / (MAXN + 1);
    203                 ret.a[i + j] = temp1;
    204             }
    205             else
    206             {
    207                 up = 0;
    208                 ret.a[i + j] = temp;
    209             }
    210         }
    211         if(up != 0)
    212             ret.a[i + j] = up;
    213     }
    214     ret.len = i + j;
    215     while(ret.a[ret.len - 1] == 0 && ret.len > 1)
    216         ret.len--;
    217     return ret;
    218 }
    219 BigNum BigNum::operator/(const int & b) const   //大数对一个整数进行相除运算
    220 {
    221     BigNum ret;
    222     int i,down = 0;
    223     for(i = len - 1 ; i >= 0 ; i--)
    224     {
    225         ret.a[i] = (a[i] + down * (MAXN + 1)) / b;
    226         down = a[i] + down * (MAXN + 1) - ret.a[i] * b;
    227     }
    228     ret.len = len;
    229     while(ret.a[ret.len - 1] == 0 && ret.len > 1)
    230         ret.len--;
    231     return ret;
    232 }
    233 int BigNum::operator %(const int & b) const    //大数对一个int类型的变量进行取模运算
    234 {
    235     int i,d=0;
    236     for (i = len-1; i>=0; i--)
    237     {
    238         d = ((d * (MAXN+1))% b + a[i])% b;
    239     }
    240     return d;
    241 }
    242 BigNum BigNum::operator^(const int & n) const    //大数的n次方运算
    243 {
    244     BigNum t,ret(1);
    245     int i;
    246     if(n<0)
    247         exit(-1);
    248     if(n==0)
    249         return 1;
    250     if(n==1)
    251         return *this;
    252     int m=n;
    253     while(m>1)
    254     {
    255         t=*this;
    256         for( i=1;i<<1<=m;i<<=1)
    257         {
    258             t=t*t;
    259         }
    260         m-=i;
    261         ret=ret*t;
    262         if(m==1)
    263             ret=ret*(*this);
    264     }
    265     return ret;
    266 }
    267 bool BigNum::operator>(const BigNum & T) const   //大数和另一个大数的大小比较
    268 {
    269     int ln;
    270     if(len > T.len)
    271         return true;
    272     else if(len == T.len)
    273     {
    274         ln = len - 1;
    275         while(a[ln] == T.a[ln] && ln >= 0)
    276             ln--;
    277         if(ln >= 0 && a[ln] > T.a[ln])
    278             return true;
    279         else
    280             return false;
    281     }
    282     else
    283         return false;
    284 }
    285 bool BigNum::operator >(const int & t) const    //大数和一个int类型的变量的大小比较
    286 {
    287     BigNum b(t);
    288     return *this>b;
    289 }
    290 
    291 void BigNum::print()    //输出大数
    292 {
    293     int i;
    294     cout << a[len - 1];
    295     for(i = len - 2 ; i >= 0 ; i--)
    296     {
    297         cout.width(DLEN);
    298         cout.fill('0');
    299         cout << a[i];
    300     }
    301     cout << endl;
    302 }
    303 
    304 char* BigNum::tochar(char *ss)
    305 {
    306     int indexx = 0;
    307     for(int i=0; i<len-1; i++)
    308     {
    309         int tmp = a[i], tmp_len = 0;
    310         while(tmp>0)
    311         {
    312             ss[indexx++] = tmp % 10 + '0';
    313             tmp_len++;
    314             tmp /= 10;
    315         }
    316         for(int i=tmp_len+1;i<=4; i++)
    317             ss[indexx++] = '0';
    318     }
    319     int last = a[len-1];
    320     while(last>0)
    321     {
    322         ss[indexx++] = last % 10 + '0';
    323         last /= 10;
    324     }
    325     ss[indexx] = '';
    326     return ss;
    327 }
    View Code 
     1 int main(void)
     2 {
     3     char str[10],s[10],*ans;
     4     ans = (char*)calloc(2000,sizeof(char));
     5     int len_str, len_s, point, mi, len_ans;
     6     while(cin >> str >> mi)
     7     {
     8         //=======
     9         //cout << "str: " << str << endl;
    10         point = -1, len_s = 0;
    11         len_str = strlen(str);
    12         int prezero = 0;//前缀0
    13         while(str[prezero]=='0')
    14             prezero++;
    15         for(int i=prezero; i<len_str; i++)
    16         {
    17             if(str[i]=='.')
    18             {
    19                 point = len_str - i - 1;
    20                 continue;
    21             }
    22             s[len_s++] = str[i];
    23         }
    24         s[len_s] = '';
    25         //=======
    26         //cout << "s" << s << "}" << endl;
    27         if(point==-1)
    28             point = 0;
    29         else
    30         {
    31             while(str[len_str-1]=='0')
    32             {
    33                 point--;
    34                 len_s--;
    35                 len_str--;
    36             }
    37             s[len_s] = '';
    38         }
    39         //=======
    40        // cout << "s" << s << "}" << endl;
    41         int zero_test = 0;
    42         for(int i=0; i<len_s; i++)
    43             zero_test += s[i]-'0';
    44         if(zero_test==0)
    45             cout << "0" << endl;
    46         else{
    47         point*=mi;
    48         //cout << "point:" << point << endl;
    49         BigNum b(s);
    50         b = b^mi;
    51         ans = b.tochar(ans);
    52         //=======
    53         //cout << "ans: " << ans << endl;
    54         len_ans = strlen(ans);
    55         if(point >= len_ans)
    56         {
    57             cout << "." << string(point-len_ans, '0');
    58             for(int i=len_ans-1; i>=0; i--)
    59                 cout << ans[i];
    60         }
    61         else
    62         {
    63             for(int i=len_ans-1; i>point-1; i--)
    64                 cout << ans[i];
    65             if(point>0)
    66                 cout << ".";
    67             for(int i=point-1; i>=0; i--)
    68                 cout << ans[i];
    69         }
    70         cout << endl;
    71        }
    72     }
    73     return 0;
    74 }
    View Code 
  • 相关阅读:
    【Codecs系列】之NVIDIA Jetson TX1简介
    【Life系列】之工作与生活的关系《赢在下班后》
    【Bugs系列】之could not find or load the Qt platform plugin windows解决方案
    【Books系列】之第一本书:大冰《好吗好的》读书笔记和读后感
    【Qt系列】之Qt之打包发布
    【Life系列】之我在底层的生活
    【Life系列】之关于工作和生活的思考与反思
    【Tools系列】之WORD转成PDF并生成书签
    【Tools系列】之Excel冻结窗格
    【Script系列】之CMake学习总结
  • 原文地址:https://www.cnblogs.com/byluoluo/p/3437969.html
Copyright © 2020-2023  润新知