求高精度幂
Time Limit:1 Ms| Memory Limit:10 MB
Difficulty:0
Description
对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。 现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < =n <= 25。
Input
输入有多行,每行有两个数R和n,空格分开。R的数字位数不超过10位。
Output
对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。
Sample Input
95.123 12
0.4321 20
5.1234 15
6.7592 9
98.999 10
1.0100 12
0.4321 20
5.1234 15
6.7592 9
98.999 10
1.0100 12
Sample Output
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
.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");
}