- 总时间限制:
- 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("
");
65 }
66 return 0;
67 }
-