繁琐的水题。试过用float类型来存储R,会产生浮点数精度问题,比如把5.1234实际存储成5.12340021,最后还是选择先用string类变量存储R,再进行处理,应该有更好的办法。
#include <iostream>
#include <string>
#include <cmath>
#include <cstdio>
#include <cstdlib>
using namespace std;
string add(string a,string b)//单步结果累加过程
{
int m,n,i,p,in;
string *s;
m=a.size();
n=b.size();
s=m<n?&a:&b;
for(i=0;i<fabs(m-n);i++)
*s='0'+*s;
m=a.size();
in=0,p=0;
for(i=m-1;i>=0;i--)
{
p=a[i]+b[i]+in-'0'*2;
a[i]=p%10+'0';
in=p/10;
}
if(in)
a='1'+a;
return a;
}
string multiply(string a,int b)//单步乘法过程
{
int p=0,l,i,in=0;
char c;
l=a.size();
for(i=l-1;i>=0;i--)
{
p=(a[i]-'0')*b+in;
a[i]=p%10+'0';
in=p/10;
}
if(in)
{
c='0'+in;
a=c+a;
}
return a;
}
string Big_Number_Multiply(string a,string b)//单次乘积过程
{
int l=b.size(),i;
string c,d="0",sum="0";
for(i=l-1;i>=0;i--)
{
c=a;
c=multiply(a,b[i]-'0');
if(i!=l-1)
{
c=c+d;
d=d+'0';
}
sum=add(sum,c);
}
return sum;
}
string Big_Number_Exponentiation(string s,int n)
{
int i;
string result=s;
for(i=1;i<n;i++)
result=Big_Number_Multiply(result,s);
return result;
}
int main()
{
//freopen("Input.txt","r",stdin);
//freopen("Output.txt","w",stdout);
char str[5];
string s;
int n,d,i,j,l,k,a;
while(cin>>s>>n)
{
a=0,d=0,k=1;
for(j=5;s[j]=='0';j--);//逆向查找,跳过末尾的0
for(i=j;i>=0;i--)//把小数R转化为整数a
{
if(s[i]!='.')
{
a=a+(s[i]-'0')*k;
k*=10;
}
else
d=j-i;//记录R的小数位数
}
sprintf(str,"%d",a);
s=Big_Number_Exponentiation(str,n);
//以下部分控制输出格式
l=s.size();
if(d==0)//若R为整数,则输出为整数
cout<<s;
else if(l>d*n)//若R整数部分不为0,控制小数点位置
{
for(i=0;i<l-d*n;i++)
cout<<s[i];
cout<<'.';
for(i=l-d*n;i<l;i++)
cout<<s[i];
}
else//若R整数部分为0,控制小数部分开始的0的输出
{
cout<<'.';
for(i=0;i<d*n-l;i++)
cout<<'0';
cout<<s;
}
cout<<endl;
}
return 0;
}