UVA 748-Exponentiation
题目大意:算含小数点的数的n次方
解题思路:先把小数点去掉,然后大位数乘法
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
void mul(char* a, char* b) {
int l1 = strlen(a);
int l2 = strlen(b);
int m[630000], n[630000], s[630000];
int k = 0;
memset(s, 0, sizeof(s));
for(int i = l1 - 1; i >= 0; i--)
m[k++] = a[i] - '0';
k = 0;
for(int i = l2 - 1; i >= 0; i--)
n[k++] = b[i] - '0';
for(int i = 0; i < l1; i++) {
k = i;
for(int j = 0; j < l2; j++) {
s[k] = s[k] + m[i] * n[j];
k++;
}
}
int u = 0;
for(int i = 0; i < l1 + l2; i++) {
s[i] = s[i] + u;
u = s[i] / 10;
s[i] = s[i] % 10;
}
k = -1;
char c[10000];
for(int i = l1 + l2 - 1; i >= 0; i--) {
if(k != -1)
c[k++] = '0' + s[i];
else if(s[i] != 0) {
k = 0;
c[k++] = '0' + s[i];
}
}
c[k] = '\0';
strcpy(a, c);
}
int main() {
char s[630000];
int n;
char a[630000], b[630000];
int p;
while((scanf("%s%d", a, &n)) != EOF) {
getchar();
for(int i = 0; i < strlen(a); i++) {
if(a[i] == '.') {
p = i;
a[i] = '\0';
break;
}
}
strcat(b, a+p+1);
for(int i = strlen(b) - 1; b[i] == '0'; i--) {
b[i] = '\0';
if(i == 0)
break;
}
strcat(a, b);
p = strlen(b) * n;
strcpy(s, a);
for(int i = 0; i < n - 1 ; i++) {
mul(s, a);
}
if(p > strlen(s)) {
cout << '.';
for(int i = 0; i < p - strlen(s); i++)
cout << '0';
for(int i = 0; i < strlen(s); i++) {
cout << s[i];
}
}
else if(p == 0) {
for(int i = 0; i < strlen(s); i++) {
cout << s[i];
}
}
else {
for(int i = 0; i < strlen(s); i++) {
if(i == strlen(s) - p)
printf(".");
cout << s[i];
}
}
cout << endl;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
}
return 0;
}