Time Limit: 500MS
Memory Limit: 10000K
Description
对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。
现在要你解决的问题是:对一个实数R( 0.0 < R < 99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < n <= 25。
Input
T输入包括多组 R 和 n。 R 的值占第 1 到第 6 列,n 的值占第 8 和第 9 列。
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
代码来源于 https://www.cnblogs.com/leewiki/archive/2011/12/11/2283911.html
#include <iostream>
using namespace std;
int main()
{
char r[6]={'0'};//底数
int n=1;//指数
while(cin>>r>>n)
{
int m[250]={0};
int b[6]={0};
int i,j,m_i;
int m_number=0,m_data=0;//小数点个数,每次相乘的数据
for(i=0;i<6;i++)//找到小数点的位置
{
if(r[i]=='.')
{
m_i=i;
break;
}
}
if(i==6)//说明没有小数点
{
j=0;
while(r[j]=='0')
{
r[j]='a';
j++;
}
m_number=0;
}
else//说明有小数点
{
i=0;
while(i<m_i&&r[i]=='0')//小数点之前前导0处理为-1
{
r[i]='a';
i++;
}
i=5;
while(i>m_i&&(!r[i]||r[i]=='0'))//小数点之后的后缀零处理
{
r[i]='a';//赋值为a
i--;
}
for(i=5;i>=0;--i)
{
if(!r[i]||r[i]=='a')continue;
if(r[i]=='.')break;
m_number++;//判断有多少小数
}
}
for(i=0,j=0;i<6;++i)
{
if(r[i]=='a')continue;
if(r[i]=='.')continue;
if(!r[i])continue;
b[j]=(int)(r[i]-'0');//转成int的b
j++;
}
while(j<6)
{
b[j]=-1;
j++;
}//b可以弄出实数来了
for(i=0;i<6;++i)
{
if(b[i]==-1)continue;
m_data=m_data*10+b[i];//相乘的大数
}
for(j=5,i=250-1;j>=0&&i>=0;--j)
{
if(b[j]==-1)continue;
else
{
m[i]=b[j];//赋值给m
i--;
}
}
m_number=m_number*n;
n--;
while(n--&&i!=249)//如果出现输入都是0
{
for(j=i+1;j<250;j++)//有这么多位
{
int tem=m[j]*m_data;//每一位与数相乘
m[j]=0;
if(tem==0)m[j]=0;
else
{
int t=j;
while(tem/10!=0||tem%10!=0)
{
m[t]=m[t]+tem%10;//将每一位都分离出来存放在不同的单元
int tt1=t;
while(m[tt1]>9)//对超过9的处理
{
int tem2=m[tt1];
m[tt1]=tem2%10;//得到这位的数据
tt1--;
m[tt1]=m[tt1]+tem2/10;//往前加进的位数
}
t--;
tem=tem/10;
}
}
}
i=0;
while(m[i]==0)i++;//找到m中第一个非零的位置
i--;
}
i=0;
while(i<250&&m[i]==0)
i++;
if(m_number==0)//对没有小数点的处理
{
if(i==250)cout<<0<<endl;
else
{
for(;i<250;++i)cout<<m[i];
cout<<endl;
}
}
else//有小数点的处理
{
if(m_number>250-i)//250-i表示在i之前有i个零,有250-i个非零
{//小数点超过相乘得到的实数,则补零
cout<<".";
while(m_number-->250-i)
cout<<0;
for(;i<250;i++)
cout<<m[i];
cout<<endl;
}
else
{
for(;i<250;++i)
{
if(m_number==250-i)cout<<".";//包含处理等于
cout<<m[i];
}
cout<<endl;
}
}
}
return 0;
}