poj 1001 uva 748 Exponentiation(高精度小数乘法)

来源:互联网 发布:手机淘宝怎么发买家秀 编辑:程序博客网 时间:2024/05/01 08:34

题意是求R的n次方,R为0.0 到 99.999 的小数。

几个细节,一个是小数点的摆放位置;一个是小数点后无效的零要去掉;一个是结果的前导零和后导零都要去掉;还有一个是如果结果是整数,不输出小数点。

一个技巧,直接用一个base保存原来的数,省去不少空间,还降低了代码的复杂度。酷炫到没朋友。


代码:

#include <stdio.h>#include <iostream>using namespace std;const int Maxn = 200;int main(){    #ifdef LOCAL    freopen("in.txt", "r", stdin);    #endif // LOCAL    int s[Maxn];//记录最终结果    char R[7];//底数    int n;//幂    while (cin >> R >> n)    {        int base = 0;//记录去小数点后的数字        int dot = -1;//记录小数点        for (int i = 0; i < 6; i++)        {            if (R[i] == '.')            {                dot = 6- 1 - i;            }            else            {                base = base * 10 + R[i] - '0';            }        }        //printf("%d\n", base);        //处理小数点后无效零的情况        if (dot)        {            for (int i = 5; R[i] == '0'; i--)            {                base /= 10;                dot--;            }        }        //printf("%d\n", base);        //结果的小数的位数        dot *= n;        //printf("%d\n", dot);        //把base赋值入数组num[]中,为大数乘法做准备        int tmp = base;        for (int i = 0; i < Maxn; i++)        {            s[i] = tmp % 10;            tmp /= 10;        }        //乘法运算        for (int j = 1; j < n; j++)        {            int jinwei = 0;            for (int i = 0; i < Maxn; i++)            {                s[i] = s[i] * base + jinwei;                jinwei = s[i] / 10;                s[i] %= 10;            }        }        int len = Maxn - 1;        /*for (; len >= 0; len--)            if (s[len]) break;*/        while (!s[len])            len--;        if (dot > len)//结果无整数部分        {            cout << ".";            for (int i = dot - 1; i >= 0; i--)                cout << s[i];        }        else//结果有整数部分        {            for (; len > dot - 1; len--)                cout << s[len];            if (len >= 0)                cout << ".";            for (; len >= 0; len--)                cout << s[len];        }        cout << endl;    }    return 0;}


0 0