[POJ]1001 Exponentiation

写了一个下午,关于高精度幂的计算,涉及到高精度乘法,具体算法可以百度一下。

重点在于输出数据的处理,包括小数点的位数,0.xxx的处理,小数部位全是0的处理,把情况都考虑好就没什么问题了。

PS:这道题放在第二,真是相当的坑爹,不知道坑到了多少人。反正我是被坑到了。

以下是代码。

//By:一只大幽灵
//Time:2012/4/10 0:43

#include <iostream>
#include <cstring>
using namespace std;

class Exponentiation {
public:
    void initial();
    void in();
    void calc();
    void format(char s[]);
private:
    int a[500], b[500], c[500];
    char str[20];
    int n, poi, t, flag, num, p, i, k, j;
};

void Exponentiation::initial() {
    memset(a, 0, sizeof (a));
    memset(b, 0, sizeof (b));
    memset(c, 0, sizeof (c));
    poi = 0;
}

void Exponentiation::in() {
    while (cin >> str >> t) {
        initial();
        format(str);
        calc();
    }
}

void Exponentiation::format(char s[]) {
    int i, k = 0;
    int len = strlen(s);
    for (i = 0; i < len; i++) {
        if (s[len - 1 - i] >= '0' && s[len - 1 - i] <= '9') a[k++] = s[len - 1 - i] - '0';
        else if (s[len - 1 - i] == '.') poi = i;
    }
}

void Exponentiation::calc() {
    for (i = 0; i < 6; i++)
        b[i] = a[i];
    if (!t) printf("1\n");
    else {
        for (i = 2; i <= t; i++) {
            for (j = 0; j < 500; j++) {
                c[j] = a[j];
            }
            memset(a, 0, sizeof (a));
            for (j = 0; j < 6; j++) {
                for (k = 0; k < 490; k++) {
                    a[k + j] += c[k] * b[j];
                }
            }
            flag = 0;
            for (j = 0; j < 500; j++) {
                num = a[j] + flag;
                a[j] = num % 10;
                flag = num / 10;
            }
        }
        p = poi*t;
        for (i = 0; i < poi * t; i++)
        {
            if (a[i]) {
                p = i;
                break;
            }
        }
        flag = 0;
        for (i = 499; i >= p; i--) {
            if (i == poi * t - 1 && !flag) {
                cout << '.' << a[i];
                flag = 1;
            } else if (i == poi * t - 1 && flag) cout << '.' << a[i];
            else if (!flag && a[i]) {
                flag = 1;
                cout << a[i];
            } else if (flag) cout << a[i];
            else if (i == p) cout << a[i];
        }
        cout << endl;
    }
}

int main() {
    Exponentiation exp;
    exp.in();
    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值