写了一个下午,关于高精度幂的计算,涉及到高精度乘法,具体算法可以百度一下。
重点在于输出数据的处理,包括小数点的位数,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;
}