-
描述
对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题
现在要你解决的问题是:对一个实数R( 0.0< R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < =n< = 25。
-
输入
- 输入有多行,每行有两个数R和n,空格分开。R的数字位数不超过10位。 输出
- 对于每组输入,要求输出一行,该行包含精确的 R 的 n 次方。输出需要去掉前导的 0 后不要的 0 。如果输出是整数,不要输出小数点。 样例输入
-
95.123
-
120.4321
-
205.1234
-
156.7592
-
998.999
-
101.0100
-
12
样例输出
-
548815620517731830194541.899025343415715973535967221869852721
-
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
-
43992025569.928573701266488041146654993318703707511666295476720493953024
-
29448126.764121021618164430206909037173276672
-
90429072743629540498.107596019456651774561044010001
-
1.126825030131969720661201
代码如下:
#include <cstdio>
#include<iostream>
#include<string>
using namespace std;
int a[250];
int main()
{
int i,j;
string str;
int n;
while(cin>>str>>n)
{
memset(a,0,sizeof(a));
int dot = 0,bit = 1,num = 0,flag = 1,sum = 0,tag;
for(i = str.size() - 1,j = 0; i >= 0; i--)//调整使满足题意的数
if(flag && str[i] - '0' == 0)
sum++;
else
{
flag = 0;
if(str[i] == '.')
dot = str.size() - sum- i - 1;//记住小数点的位置
else
{
a[j++] = str[i] - '0';
num += (str[i] - '0') * bit;
bit *= 10;
}
}
for(i = 0; i < n - 1; i++)//计算
{
tag = 0;
for(j = 0; j < 250; j++)
{
tag = a[j] * num + tag;
a[j] = tag % 10;
tag /= 10;
}
}
if(n == 0) //输出
printf("1\n");
else
{
for(i = 249; a[i] == 0 && i > dot * n - 1; i--);
for(; i >= 0; i--)
{
if(i == dot * n - 1)
printf(".");;
printf("%d",a[i]);
}
printf("\n");
}
}
return 0;
}