题目链接:点击打开链接
题目大意:求一个有理数的n次方
题目分析:这么大的数就是高精度乘法,然后有些具体的要求。用数组的方法。
题目总结:具体看下discuss里面的数据很不错。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 20000
using namespace std;
int n,dot,len_a,len_b;
char str[10];
int a[maxn],b[maxn],tmp[maxn];
void init()
{
memset(a,0,sizeof(a));//初始化
memset(b,0,sizeof(b));
dot=-1;
for(int i=5,j=1; i>=0; i--)//转化
{
if(str[i]!='.') a[j]=b[j++]=str[i]-'0';//之前有点纠结j和j++的东西,等价于:a[j]=b[j]=str[i]-'0';j++;
else dot=i;
}
if(dot==-1) len_a=len_b=6;
else len_a=len_b=5;
}
void multi()
{
int i,j;
memset(tmp,0,sizeof(tmp));
for(i=1; i<=len_a; i++)
for(j=1; j<=len_b; j++)
{
tmp[i+j-1]+=a[i]*b[j];
if(tmp[i+j-1]>9)
{
tmp[i+j]+=tmp[i+j-1]/10;
tmp[i+j-1]%=10;
}
}
if(tmp[len_a+len_b-1]>9)
{
tmp[len_a+len_b]+=tmp[len_a+len_b-1]/10;
tmp[len_a+len_b-1]%=10;
}
len_a=len_a+len_b;
for(i=1; i<=len_a; i++) a[i]=tmp[i];
}
int main()
{
int flag,i,j,head,tail;
while(~scanf("%s%d",str,&n))
{
init();
for( i=1; i<n; i++) multi();
if(dot==-1)
{
for(i=len_a; i>=1; i--)
{
printf("%d",a[i]);
}
printf("\n");
}
else
{
dot=5-dot;
dot*=n;
for(i=1; i<=len_a; i++)
{
if(a[i]!=0)
{
tail =i;
break;
}
}
for(j=len_a; j>=1; j--)
{
if(a[j]!=0)
{
head =j;
break;
}
}
if(head<dot){head=dot;}
if(tail>dot){tail=dot+1;}
for(j=head; j>=tail; j--)
{
if(j==dot) printf(".");
printf("%d",a[j]);
}
printf("\n");
}
}
return 0;
}