hdu 1063 && pku1001
嘿嘿,转帖的代码,感觉简单明了
大数乘法来的,不过要注意的问题还真多
#include <stdio.h>
#include <string.h>
void times(char *a,char *b,char *t) //大数乘法,a和b相乘,结果赋给t
{
int len_a=strlen(a),len_b=strlen(b);
int c[10]={0},d[200]={0},e[200]={0};
for(int i=0;i<len_a;i++)
c[i]=a[len_a-1-i]-'0';
for(int i=0;i<len_b;i++)
d[i]=b[len_b-1-i]-'0';
int k;
for(int i=0;i<len_a;i++)
for(int j=0;j<len_b;j++)
{
k=i+j;
e[k]+=c[i]*d[j];
if(e[k]>9)
{
e[k+1]+=e[k]/10;
e[k]%=10;
}
}
int len_t=e[k+1] ? k+2 : k+1;
for(int i=0;i<len_t;i++)
t[i]=e[len_t-1-i]+'0';
t[len_t]=0;
}
int main()
{
char temp[10];
int n;
while(scanf("%s%d",temp,&n)!=EOF)
{
char r[10]; //从这往下,是将temp去头去尾,将小数化整数,存到r中
int i,j=0,cnt,end; //cnt记录小数位数,end用于去掉小数后面多于的0
for(i=0;temp[i]=='0';i++); //找第一个不为0的位置,该位置只有两种可能:小数点或数字
if(temp[i]=='.')
{
for(end=strlen(temp)-1;temp[end]=='0';end--);
cnt=end-i;
for(i++;temp[i]=='0'&&temp[i];i++);
for(;i<=end;i++)
r[j++]=temp[i];
}
else
{
for(;temp[i]!='.'&&temp[i];i++)
r[j++]=temp[i];
if(temp[i]==0) cnt=0;
else
{
for(end=strlen(temp)-1;temp[end]=='0';end--);
cnt=end-i;
for(i++;i<=end;i++)
r[j++]=temp[i];
}
}
r[j]=0;
char t[200]; //t存放最终结果
strcpy(t,r);
int flag=cnt; //flag记录小数位数
while(--n)
{
times(r,t,t);
flag+=cnt;
}
int len_t=strlen(t);
if(flag==0) puts(t); //flag=0,说明结果是整数
else if(flag>=len_t) //flag>=len_t,说明需要在小数点后面、t 前面补0
{
putchar('.');
cnt=flag-len_t;
while(cnt--)
putchar('0');
puts(t);
}
else //小数点在 t 中间
{
flag=len_t-1-flag;
for(i=0;t[i];i++)
{
putchar(t[i]);
if(i==flag) putchar('.');
}
putchar('\n');
}
}
return 0;
}