求高精度冪
Time Limit:1 Ms| Memory Limit:10 MB
Difficulty:0
Description
Input
Output
Sample Input
0.4321 20
5.1234 15
6.7592 9
98.999 10
1.0100 12
Sample Output
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
Source
#include<stdio.h>
#include<string.h>
#define N 500
char str[N], n;
int count;
int len, len2;
int a[N], b[N];
int ans[N];
void mul();
void print();
void init_ans();
int main(){
// freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int tmp;
int i, j;
while(scanf("%s%d", str, &n) != EOF){
count = -1;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
len = strlen(str);
//printf("%d\n", len);
for(i = 0, j = 0; i < len; i++){
if(str[i] != '.'){
a[j++] = str[i] - '0';
}
if(str[i] == '.'){
count = (len - (i + 1)) * n - 1 ;//小數點的最終打印位置
// printf("===%d\n", count);
}
}
len = j;
len2 =1;
for(i = 0, j = len -1; i <= j; i++, j--){//transposed inverse matrix
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
b[0] = 1;
while(n--){
memset(ans, 0, sizeof(ans));
mul();
for(i = 0; i < N; i++){
b[i] = ans[i];
}
}
print();
}
return 0;
}
void mul(){
int i, j, m;
int tmp;
for(i = 0; i < len; i++){//第幾個數做乘法
for(j = 0; j < len2; j++){//乘所有位的數
ans[i+j] += a[i] * b[j];
}
}
for(i = 0; i < N - 2; i++){
ans[i+1] += ans[i] / 10;
ans[i] = ans[i] % 10;
}
for(i = N - 1; ans[i] == 0; i--)
;
len2 = i + 1;//求新的長度
}
void print(){
int i, j;
int flag = 0;
for(i = N - 1; ans[i] == 0; i--){//找到小數點或者部位0的第一位
if(i == count){
flag = 1;
break;
}
}
// printf("%d\n", i);
for(j = 0; j < i && ans[j] == 0; j++)
;//找到數字後綴不爲零的第一位
for( ; i >= j; i--){ //打印可用的部分, 遇到小數點打印
if(count != -1 && (i == count)){
printf(".");
}
printf("%d", ans[i]);
}
printf("\n");
}