高精求小数幂--高精度乘法+小数
2.标记小数位置和去除前导零和后面多余的0。1.memset初始化要在正确位置。
·
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;
}
更多推荐



所有评论(0)