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

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

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

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


代码:

#include 
#include 
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;
}


你可能感兴趣的:(数论数学)