恒邪

Poj.Grids 2951 浮点数求高精度幂

总时间限制:
1000ms
内存限制:
65536kB
描述
有一个实数 R ( 0.0 < R < 99.999 ) ,要求写程序精确计算 R 的 n 次方。n 是整数并且 0 < n <= 25。
输入
T输入包括多组 R 和 n。 R 的值占第 1 到 第 6 列,  n 的值占第 8 和第 9 列。
输出
对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后后面不不要的 0 。如果输出是整数,不要输出小数点。
样例输入
95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12
样例输出
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
 1 //@author langx
 2 //G++4.4
 3 #include <cstdio>
 4 #include <cstring>
 5 #define SIZE 126
 6 #define LEN 5
 7 
 8 int a[SIZE],b[LEN];
 9 
10 int mul( int alen,int blen){
11     int tmp[SIZE], i, j, k;
12     memset(tmp,0,sizeof(tmp));
13     for( i = 0; i < alen; ++i){
14         for( j = 0; j < blen; ++j){
15             tmp[i + j] += a[i] * b[j];
16         }   
17     }
18     k = alen + blen - 1;
19     for( i = 0;i < k; ++i){
20         if( tmp[i] >= 10){
21             tmp[ i + 1] += tmp[i] / 10;
22             tmp[i] = tmp[i] % 10;
23         }
24         a[i] = tmp[i];
25     }
26     a[i] = tmp[i];
27     if( tmp[k] !=0 )k++;
28     return k;
29 }
30 
31 int main(){
32     char r[LEN + 1];
33     int n, i, j, len, alen, mark, formark, ok;
34     while( scanf("%s%d",r, &n) == 2 ){
35         len = strlen(r);
36         mark = 0;
37         for( i = len - 1, j = 0 ; i >= 0 ; --i){
38             if(r[i]=='.'){
39                 mark =i;continue; //记录小数点位置
40             }
41             a[j] = b[j++] = r[i]-'0';
42         }
43         --len;
44         mark = len - mark;
45         alen = len;
46         for( i = 1;i < n; i++){
47             alen = mul( alen,len);
48         }
49         for( i = 0; i < alen; ++i){
50             if( a[i] != 0)break;
51         }
52         mark *= n;
53         formark = i; //记录后缀,如70.10000
54         ok = 0;
55         for( i = alen-1; i >= formark; --i){
56             if( a[i] == 0 && i >= mark && !ok )continue;
57             if( i == mark - 1) printf(".");
58             printf("%d", a[i]);
59             ok = 1;
60         }
61         for(formark--; formark >= mark; --formark){
62             printf("0");
63         }
64         printf("\n");
65     }
66     return 0;
67 }

 

 

 

posted on 2014-05-08 15:56  恒邪  阅读(515)  评论(0编辑  收藏  举报

导航