https://www.51nod.com/Challenge/Problem.html#!#problemId=1873
思路:小数乘法模板~
代码:
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
using namespace std;
const int maxn=200010;
int n,m;
char s[maxn],ss[maxn];
int a[maxn],c[maxn],b[maxn];
int main()
{
int T,cas=1;
scanf("%s %d",ss,&n);
int l=strlen(ss);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int pos,fr=100000,ed=99999;
rep(i,0,l-1)
{
if(ss[i]=='.') pos=i;
c[i]=(ss[i]&15);
}
for(int i=pos-1;i>=0;i--) a[--fr]=c[i];
for(int i=pos+1;i<l;i++) a[++ed]=c[i];
/*
rep(i,fr,ed)
{
if(i==100000) cout<<'.';
cout<<a[i];
}
cout<<endl;
*/
while(--n)
{
for(int i=ed;i>=fr;--i) b[i]=a[i];
for(int i=ed;i>=fr;--i) a[i]=0;
for(int i=ed;i>=fr;--i)
{
for(int j=l-1;j>=0;j--)
{
if(j>pos)
{
a[i+j-pos]+=b[i]*c[j];
if(a[i+j-pos]) ed=max(ed,i+j-pos);
}
if(j<pos) a[i-(pos-j-1)]+=b[i]*c[j];
}
}
for(int i=ed;i>=fr;--i)
{
a[i-1]+=a[i]/10;
a[i]%=10;
if(a[fr-1]) fr--;
}
}
while(a[fr]==0&&fr<100000) fr++;
while(a[ed]==0&&ed>=100000) ed--;
rep(i,fr,ed)
{
if(i==100000) cout<<'.';
cout<<a[i];
}
cout<<endl;
return 0;
}