高精度一直做的不好。。今天刚刚好看到了以前写的这道题(当时基本上一半多都是抄的答案。。)
就把以前写的代码整理了一下,简化了一点
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char a[10];
int n,b=0,c[250]={0},i,j,x,flag;
while(cin>>a>>n)
{
flag=b=0;
memset(c,0,sizeof(c));
c[249]=1;
for(i=0;a[i]!='\0';i++)
{
if(a[i]=='.')
{
x=i;
continue;
}
b=b*10+a[i]-'0';
}
x=i-x-1;
for(i=1;i<=n;i++)<span style="font-family: Arial, Helvetica, sans-serif;">//其实这一段不管是什么进制都可以用这种方法做吧。。先全部算完再考虑进位的问题</span>
{
for(j=0;j<250;j++)c[j]*=b;
for(j=249;j>=0;j--)
{
if(c[j]>=10)
{
c[j-1]+=c[j]/10;
c[j]%=10;
}
}
}
for(i=249;c[i]==0&&i>250-n*x-1;i--);
flag=i;
//以下分三种情况讨论,整数,小数部分为0,其他。主要是去前导零,小数后面没用的零
if(!strstr(a,"."))
{
for(i=0;c[i]==0;i++);
for(;i<250;i++)printf("%d",c[i]);
}
else if(a[0]=='0')
{
printf(".");
for(i=250-n*x;i<=flag;i++)printf("%d",c[i]);
}
else
{
for(i=0;c[i]==0;i++);
for(;i<250-n*x;i++)printf("%d",c[i]);
if(flag!=250-n*x-1)printf(".");
for(;i<=flag;i++)printf("%d",c[i]);
}
printf("\n");
}
return 0;
}