高精求小数幂--高精度乘法+小数
https://www.luogu.com.cn/problem/P1517
1.memset初始化要在正确位置
2.标记小数位置和去除前导零和后面多余的0
#include<bits/stdc++.h>
#include<string>
using namespace std;
#define N 100011
typedef long long ll;
typedef pair<int,int> pii;
int a[110555],b[110555],c[110555],an[110555];
int n;
string s;
int pos;
int main()
{
while(cin>>s>>n)
{int p=0;memset(a,0,sizeof(a));memset(b,0,sizeof(b));for(int i=s.size()-1;i>=0;i--){if(s[i]=='.') pos=s.size()-i-1;else a[p++]=s[i]-'0';}pos=pos*n;///记录n次方的小数点位置 int l=p;for(int i=0;i<p;i++) b[i]=a[i];n--;while(n--)n次方 {memset(c,0,sizeof(c));///一定在这里初始化c和an数组,不然后面乘怎么搞啊 memset(an,0,sizeof(an));///高精度乘法 for(int j=0;j<p;j++){for(int i=0;i<l;i++){c[i+j]+=a[j]*b[i];}}int co=0;for(int i=0;i<p+l+7;i++){int w=(c[i]+co)%10;co=(c[i]+co)/10;an[i]=w;}l=p+l+7;for(int i=0;i<l;i++) b[i]=an[i];}int w=0,r=0;for(int i=l+15;i>=pos;i--){if(!b[i]) w++;else break;}for(int i=0;i<=l+15-w;i++){if(!b[i]) r++;else break;}for(int i=l+15-w;i>=pos;i--)///整数部分 {cout<<b[i];}for(int i=pos-1;i>=r;i--)///有小数部分 {if(i==pos-1) cout<<"."<<b[i];else cout<<b[i];}cout<<endl;
}
return 0;
}