好吧,又一轮刷POJ,之前欠下的债现在还上,前面还有个1001没做,看着摆在那总觉得不舒服= =虽然觉得麻烦......好吧,终究还是要写的。
题意很简单,就是给你一个小数,然后求他的n次幂,麻烦就麻烦在高精度的还要写小数= =高精度的模板之前倒是打过,不过这个是小数,所以还要把对小数的处理加上。写这一步倒是花的时间比我预料中的要少,毕竟小数相乘,先处理好一开始的小数点后面有几位。最后结果的小数点后位数就是乘以n,再处理一下0就好了。不过这题最后处理格式弄晕了= =如果后面有小数前面是0就不用写0了,如果后面没有就不输出小数点了,比如结果是“0.01”就是“.01”,结果是“12”就是“12”,结果是“0.0”的话输出就是“0”。这些处理完之后还是WA了,才发现没有处理n是1的情况,好吧,百度到一个“10.000 1”的例子才发现了这个问题.....所以改来改去一会这加点一会那加点的,代码就弄的挺长了......
总之A了就好~
下面代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char shu[1005];
char ans[1005];
int n;
char mus[1005];
int multiply(char* a1,char* b1)
{
memset(mus,0,sizeof(mus));
int i,j,k;
int len,len1,len2;
len1=strlen(a1);
len2=strlen(b1);
int mut=0,t;
bool va[105];
int s[105],adt[105];
char a[105],b[105];
memset(s,0,sizeof(s));
memset(adt,0,sizeof(adt));
memset(va,0,sizeof(va));
for(i=len1-1,j=0;i>=0;i--)
{
a[i]=a1[j];
j++;
}
for(i=len2-1,j=0;i>=0;i--)
{
b[i]=b1[j];
j++;
}
for(i=0;i<len1;i++)
{
mut=0;
for(j=0;j<len2;j++)
{
t=(a[i]-'0')*(b[j]-'0')+mut;
mut=0;
if(t>=10)
{
mut=t/10;
t=t%10;
}
s[i+j]=t+s[i+j]+adt[i+j];
va[i+j]=1;
adt[i+j]=0;
if(s[i+j]>=10)
{
if(!va[i+j+1])
adt[i+j+1]=s[i+j]/10+adt[i+j+1];
else
adt[i+j+1]=s[i+j]/10;
s[i+j]=s[i+j]%10;
}
}
s[i+j]=mut;
}
s[i+j-1]=mut+adt[i+j-1];
if(s[i+j-1]!=0)
k=i+j-1;
else
k=i+j-2;
for(i=k,j=0;i>=0;i--)
{
mus[i]=(s[j]+'0');
j++;
}
return 0;
}
int main()
{
int i,j;
int len;
while(scanf("%s",shu)!=EOF)
{
j=0;
scanf("%d",&n);
memset(ans,0,sizeof(ans));
if(n==1)
{
strcpy(ans,shu);
for(i=strlen(ans)-1;i>0;i--)
{
if(ans[i]!='0')
break;
ans[i]=ans[i+1];
}
for(i=0;i<strlen(ans);i++)
{
if(ans[i]!='0')
{
j=i;
break;
}
}
if(j!=0)
{
for(i=0;i<strlen(ans)-j+1;i++)
{
ans[i]=ans[i+j];
}
}
if(ans[strlen(ans)-1]=='.')
{
ans[strlen(ans)-1]=ans[strlen(ans)];
}
if(strlen(ans)==0)
cout<<0<<endl;
else
cout<<ans<<endl;
memset(shu,0,sizeof(shu));
continue;
}
for(i=0;i<strlen(shu);i++)
{
if(shu[i]=='.')
{
j=strlen(shu)-i-1;
break;
}
}
//cout<<j<<endl;
for(;i<strlen(shu);i++)
{
shu[i]=shu[i+1];
}
multiply(shu,shu);
strcpy(ans,mus);
for(i=2;i<n;i++)
{
multiply(shu,ans);
strcpy(ans,mus);
}
len=strlen(ans)-n*j;
//cout<<n*j<<endl;
for(i=strlen(ans);i>=len;i--)
{
ans[i+1]=ans[i];
}
ans[len]='.';
for(i=strlen(ans)-1;i>0;i--)
{
if(ans[i]!='0')
break;
ans[i]=ans[i+1];
}
for(i=0;i<strlen(ans);i++)
{
if(ans[i]!='0')
{
j=i;
break;
}
}
if(j!=0)
{
for(i=0;i<strlen(ans)-j+1;i++)
{
ans[i]=ans[i+j];
}
}
if(ans[strlen(ans)-1]=='.')
{
ans[strlen(ans)-1]=ans[strlen(ans)];
}
if(strlen(ans)==0)
cout<<0<<endl;
else
cout<<ans<<endl;
memset(shu,0,sizeof(shu));
}
return 0;
}