基准时间限制:1 秒 空间限制:131072 KB 分值: 10
难度:2级算法题
Noder现在上初三了,正在开始复习中考。他每天要计算型如 (a× a× a× ⋯× a)n个a 的式子。 其中 0.0<a<99.999,0<n<26 。
虽然Noder会计算,但是老是算错,现在他想要你来写一个程序输出正确的结果,以便他核对。
Input
单组测试数据。 第一行有一个实数a和一个整数n,中间用空格分开。 0.0 < a < 99.999,a总是占6位(a长度<=6),0<n<26。
Output
输出一个实数表示结果,不要输出前导0,后面多余的0也不要输出,如果是整数不要输出小数点。
Input示例
样例输入1 0.4321 20 样例输入2 1.0100 12
Output示例
样例输出1 .00000005148554641076956121994511276767154838481760200726351203835429763013462401 样例输出2 1.126825030131969720661201
题意:》》》
思路:仿照大整数乘法,记录小数点的位置,然后将输入当成整数来进行乘法,最后加上小数点即可;
下面附上我的代码:
#include<bits/stdc++.h>
using namespace std;
char s[1005];
struct BigNum
{
int len;
int num[1005];
int point;
BigNum init()
{
len=1;
memset(num,0,sizeof(num));
point=0;
}
};
BigNum Mul(BigNum &a,BigNum &b)
{
BigNum c;
c.init();
c.point=a.point+b.point;
for(int i=0;i<a.len;i++)
for(int j=0;j<b.len;j++)
{
c.num[i+j]+=a.num[i]*b.num[j];
if(c.num[i+j]>=10)
{
c.num[i+j+1]+=(int)c.num[i+j]/10;
c.num[i+j]%=10;
}
}
int len=a.len+b.len;
while(c.num[len-1]==0&&len>1&&len>c.point) len--;
if(c.num[len])
len++;
c.len=len;
return c;
}
int main()
{
int n,t=0;
cin>>s>>n;
if(n==0)
{
puts("1");
return 0;
}
BigNum d,ans;
ans.init();
int l=strlen(s);
for(int i=l-1;i>=0;i--)
{
if(s[i]=='.')
{
d.point=t;
continue;
}
d.num[t++]=s[i]-'0';
}
d.len=t;
ans=d;
for(int i=0;i<n-1;i++)
ans=Mul(ans,d);
int f=ans.point;
for(int i=0;i<ans.len&&i<ans.point;i++)
{
if(ans.num[i])
{
f=i;
break;
}
}
for(int i=ans.len-1;i>=0;i--)
{
if(i==ans.point-1)
cout<<'.';
printf("%d",ans.num[i]);
if(i==f)
break;
}
printf("\n");
return 0;
}