高精度冪

 求高精度冪


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


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