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;
}

Logo

集算法之大成!助力oier实现梦想!

更多推荐