大数乘法,过不了只能说明测试用例不完备。贴几组测试用例:
5.1004 15
41120989454.314570363993506408035342551967503175087477761156936917581824
000.10 20
.00000000000000000001
12.010 20
3898164373852177448724.9596914878392975482722144801842193624001
.10000 25
.0000000000000000000000001
110000 20
67274999493256000920100000000000000000000000000000000000000000000000000000000000000000000000000000000
1.0000 25
1
1 0
1
0 1
0
0001.1 1
1.1
然后,就是代码了:
#include<string>
#include<memory>
using namespace std;
#include<math.h>
#include<stdio.h>
#define DEPTH 1000000000
int exponent,value,fractionalLen;
__int64 result[25];
void multi()
{
for(int i=1;i<exponent;i++)
{
int assist=0;
for(int j=1;j<=result[0];j++)
{
result[j]=result[j]*value+assist;
assist=result[j]/DEPTH;
result[j]=result[j]%DEPTH;
}
if(assist>0)
{
result[0]++;
result[result[0]]=assist;
}
}
}
int main()
{
//freopen("Exponentiation.txt","r",stdin);
char vtemp[7];
while(scanf("%s%d",&vtemp,&exponent)!=EOF)
{
memset(result,0,sizeof(result));
value=0;
fractionalLen=0;
for(int i=5,cnt=0;i>=0;i--)
{
if(vtemp[i]>='0'&&vtemp[i]<='9')
{
value=value+(vtemp[i]-'0')*pow(10.0,cnt);
cnt++;
}
else
fractionalLen=5-i;
}
while(value%10==0&&fractionalLen>0)
{
value/=10;
fractionalLen--;
}
result[1]=value;
result[0]=1;
multi();
fractionalLen*=exponent;
char assist[10];
sprintf(assist,"%d",result[result[0]]);
string answer(assist);
int len=(result[0]-1)*9+strlen(assist);
for(int i=result[0]-1;i>=0;i--)
{
sprintf(assist,"%9d",result[i]);
answer+=assist;
}
if(fractionalLen>len)
{
printf(".");
for(int i=fractionalLen-len;i>0;i--)
printf("0");
}
for(int i=0;i<len;i++)
{
if(i==len-fractionalLen)
printf(".");
if(answer[i]==' ')
printf("0");
else
printf("%c",answer[i]);
}
printf("\n");
}
return 0;
}