高精度幂

 求高精度幂


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

Sample Output

548815620517731830194541.899025343415715973535967221869852721
.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");
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章