思路: 仿照大整数乘法,记录小数点的位置,然后将输入当成整数来进行乘法,最后加上小数点即可;
#include<bits/stdc++.h>
using namespace std;
char s[1005];
struct BigNum
{
int len;
int num[1005];
int point;
BigNum init()
{
len=1;
memset(num,0,sizeof(num));
point=0;
}
};
BigNum Mul(BigNum &a,BigNum &b)
{
BigNum c;
c.init();
c.point=a.point+b.point;
for(int i=0;i<a.len;i++)
for(int j=0;j<b.len;j++)
{
c.num[i+j]+=a.num[i]*b.num[j];
if(c.num[i+j]>=10)
{
c.num[i+j+1]+=(int)c.num[i+j]/10;
c.num[i+j]%=10;
}
}
int len=a.len+b.len;
while(c.num[len-1]==0&&len>1&&len>c.point) len--;
if(c.num[len])
len++;
c.len=len;
return c;
}
int main()
{
int n,t=0;
cin>>s>>n;
if(n==0)
{
puts("1");
return 0;
}
BigNum d,ans;
ans.init();
int l=strlen(s);
for(int i=l-1;i>=0;i--)
{
if(s[i]=='.')
{
d.point=t;
continue;
}
d.num[t++]=s[i]-'0';
}
d.len=t;
ans=d;
for(int i=0;i<n-1;i++)
ans=Mul(ans,d);
int f=ans.point;
for(int i=0;i<ans.len&&i<ans.point;i++)
{
if(ans.num[i])
{
f=i;
break;
}
}
for(int i=ans.len-1;i>=0;i--)
{
if(i==ans.point-1)
cout<<'.';
printf("%d",ans.num[i]);
if(i==f)
break;
}
printf("\n");
return 0;
}
总结: 用元素组下标,开辟多个数组。记录 达到这个数的变化次数,和元素个数;