UVA 748 Exponentiation
高精度恶心题。。。
先把小数点去掉,乘完输出的时候把小数点补上。。。
要考虑前导0和后缀无意义0,,把这些0去除掉。。
比较恶心、。。。不过思路还是很清晰的
#include <stdio.h>
#include <string.h>
const int N = 205;
char str[N], ans[N];
int pos, k;
void init() {
memset(ans, 0, sizeof(ans));
ans[0] = '1';
pos = 0;
int len = strlen(str);
for (int i = len - 1; i >= 0; i --) {
if (str[i] == '0')
str[i] = '\0';
else break;
}
len = strlen(str);
for (int i = len - 1; i >= 0; i --) {
if (str[i] == '.') {
for (int j = i; j < len - 1; j ++)
str[j] = str[j + 1];
str[len - 1] = '\0';
break;
}
pos ++;
}
}
void mul() {
int A[N], B[N], C[N], lena = strlen(str), lenb = strlen(ans);
memset(A, 0, sizeof(A));
memset(B, 0, sizeof(B));
memset(C, 0, sizeof(C));
for (int i = lena - 1; i >= 0; i --)
A[i] = str[lena - 1 - i] - '0';
for (int i = lenb - 1; i >= 0; i --)
B[i] = ans[lenb - 1 - i] - '0';
for (int i = 0; i < lena; i ++)
for (int j = 0; j < lenb; j ++)
C[i + j] += A[i] * B[j];
for (int i = 0; i < lena + lenb; i ++) {
C[i + 1] += C[i] / 10;
C[i] %= 10;
}
memset(ans, 0, sizeof(ans));
for (int i = 200; i >= 0; i --)
if (C[i]) {
for (int j = i; j >= 0; j --)
ans[i - j] = C[j] + '0';
break;
}
}
void solve() {
pos *= k;
for (int i = 0; i < k; i ++)
mul();
int len = strlen(ans);
if (len < pos) {
printf(".");
for (int i = 0; i < pos - len; i++)
printf("0");
for (int i = 0; i < len; i ++)
printf("%c", ans[i]);
printf("\n");
}
else {
for (int i = 0; i < len; i ++) {
if (len - i == pos) printf(".");
printf("%c", ans[i]);
}
printf("\n");
}
}
int main() {
while (~scanf("%s%d", str, &k)) {
init();
solve();
}
return 0;
}