• UVa 748 Exponentiation


      浮点数求幂,先把浮点数转化成整数,再按大数乘法计算,最后再考虑加上小数点,对小数点的位置和关于0的处理要考虑清楚。

      代码如下:

    View Code
      1 #include <cstdio>
      2 #include <iostream>
      3 #include <cstring>
      4 #include <algorithm>
      5 using namespace std;
      6 
      7 const int maxn = 1000;
      8 
      9 struct bign
     10 {
     11     int d[maxn];
     12     int len;
     13 
     14     bign()
     15     {
     16         memset(d, 0, sizeof(d));
     17         len = 1;
     18     }
     19 
     20     bign(int num)
     21     {
     22         *this = num;
     23     }
     24 
     25     bign(char * num)
     26     {
     27         *this = num;
     28     }
     29 
     30     bign operator = (const char * num)
     31     {
     32         len = strlen(num);
     33         for(int i = 0; i < len; i++)
     34             d[i] = num[len-1-i] - '0';
     35         return *this;
     36     }
     37 
     38     bign operator = (int num)
     39     {
     40         char s[maxn];
     41         sprintf(s, "%d", num);
     42         *this = s;
     43         return *this;
     44     }
     45 
     46     bign operator + (const bign& b) const
     47     {
     48         bign c;
     49         c.len = 0;
     50         int g = 0;
     51         for(int i = 0; i < max(len, b.len) || g; i++)
     52         {
     53             int x = g;
     54             if(i < len)   x += d[i];
     55             if(i < b.len)   x += b.d[i];
     56             c.d[c.len++] = x % 10;
     57             g = x / 10;
     58         }
     59         return c;
     60     }
     61 
     62     bign operator += (const bign& b)
     63     {
     64         *this = *this + b;
     65         return *this;
     66     }
     67 
     68     void clean()
     69     {
     70         while(len > 1 && !d[len-1])
     71             len--;
     72     }
     73     
     74     bign operator - (const bign& b)
     75     {
     76         bign c;
     77         c.len = 0;
     78         int g = 0;
     79         for(int i = 0; i < len; i++)
     80         {
     81             int x = d[i] - g;
     82             if(i < b.len)   x -= b.d[i];
     83             if(x >= 0)   g = 0;
     84             else 
     85             {
     86                 g = 1;
     87                 x += 10;
     88             }
     89             c.d[c.len++] = x;
     90         }
     91         c.clean();
     92         return c;
     93     }
     94 
     95     bign operator * (const bign& b)
     96     {
     97         bign c;
     98         c.len = len + b.len;
     99         for(int i = 0; i < len; i++)
    100             for(int j = 0; j < b.len; j++)
    101                 c.d[i+j] += d[i] * b.d[j];
    102         for(int i = 0; i < c.len-1; i++)
    103         {
    104             c.d[i+1] += c.d[i] / 10;
    105             c.d[i] %= 10;
    106         }
    107         c.clean();
    108         return c;
    109     }
    110 
    111     bool operator < (const bign& b) const
    112     {
    113         if(len != b.len)   return len < b.len;
    114         for(int i = len-1; i >= 0; i--)
    115             if(d[i] != b.d[i])   return d[i] < b.d[i];
    116         return false;
    117     }
    118 
    119     bool operator > (const bign& b) const
    120     {
    121         return b < *this;
    122     }
    123 
    124     bool operator <= (const bign& b) const
    125     {
    126         return !(b < *this);
    127     }
    128 
    129     bool operator >= (const bign& b) const
    130     {
    131         return !(*this < b);
    132     }
    133 
    134     bool operator != (const bign& b) const
    135     {
    136         return b < *this || *this < b;
    137     }
    138 
    139     bool operator == (const bign& b) const
    140     {
    141         return !(b < *this) && !(b > *this);
    142     }
    143 
    144     string str() const
    145     {
    146         string res = "";
    147         for(int i = 0; i < len; i++)
    148             res = (char)(d[i]+'0') + res;
    149         if(res == "")   res = "0";
    150         return res;
    151     }
    152 };
    153 
    154 istream& operator >> (istream &in, bign& x)
    155 {
    156     string s;
    157     in >> s;
    158     x = s.c_str();
    159     return in;
    160 }
    161 
    162 ostream& operator << (ostream & out, const bign& x)
    163 {
    164     out << x.str();
    165     return out;
    166 }
    167 
    168 int main()
    169 {
    170 #ifdef LOCAL
    171     freopen("in", "r", stdin);
    172 #endif
    173     double x;
    174     int y;
    175     while(scanf("%lf%d", &x, &y) != EOF)
    176     {
    177         char num[10];
    178         sprintf(num, "%lf", x);
    179         int t = 0, dot = 0, frac = 0;
    180         for(int i = 0; num[i] != '\0'; i++)
    181         {
    182             if(num[i] == '.')   dot = 1;
    183             else
    184             {
    185                 t = t * 10 + num[i] - '0';
    186                 if(dot)   frac++;
    187             }
    188         }
    189         bign a = t, ans = 1;
    190         for(int i = 0; i < y; i++)
    191             ans = ans * a;
    192         frac *= y;
    193         if(frac < ans.len)
    194         {
    195             for(int i = ans.len-1; i >= frac; i--)   printf("%d", ans.d[i]);
    196             printf(".");
    197             int tail;
    198             for(tail = 0; tail < frac; tail++)
    199                 if(ans.d[tail])   break;
    200             for(int i = frac-1; i >= tail; i--)   printf("%d", ans.d[i]);
    201             printf("\n");
    202         }
    203         else
    204         {
    205             printf(".");
    206             for(int i = 0; i < frac-ans.len; i++)   printf("0");
    207             int tail;
    208             for(tail = 0; tail < ans.len; tail++)
    209             if(ans.d[tail])   break;
    210             for(int i = ans.len-1; i >= tail; i--)   printf("%d", ans.d[i]);
    211             printf("\n");
    212         }
    213 
    214     }
    215     return 0;
    216 }
  • 相关阅读:
    The constructors Integer(int), Double(double), Long(long) and so on are deprecated
    mysql Binlog二进制日志三种模式的日志格式介绍及区别
    MySQL错误“Specified key was too long; max key length is 1000 bytes”的解决办法
    mysql 的 bin 和 .log 日志文件会非常占用磁盘空间和 IO,修改 mysql 配置文件可以关闭这两种日志的记录。
    mysql关闭binlog日志
    MySQL实现排名并查询指定用户排名功能,并列排名功能
    ROSE框架中SQL批量操作使用
    tomcat 9.0 Tomcat NOTE: Picked up JDK_JAVA_OPTIONS: addopens=java.base/java.lang=ALLUNNAMED
    浅析Spring自定义注解+aop实现对实体类的字段进行校验
    浅析redis setIfAbsent的用法及在分布式锁上的应用及同步锁的缺陷
  • 原文地址:https://www.cnblogs.com/xiaobaibuhei/p/3031366.html
Copyright © 2020-2023  润新知