#include <stdio.h>
#include <string.h>
int a[200], f[200];
int main()
{
char str[7];
int r[7];
int n;
while( scanf("%s %d", str, &n) != EOF )
{
strrev(str);
int k = 0, flag = 0, _k = 0, dotpos;
memset(a, 0, sizeof(a));
for(int p = 0; str[p]!='\0'; p++)
if( str[p] != '.')
{ a[k] = r[k] = str[p]-'0'; k++;}
else
{
flag = 1;
dotpos = p*n;
}
_k = k;
while(--n)
{
int i, j;
memset(f, 0, sizeof(f));
for(j = 0; j < k; j++)
{
int c = 0;
for(i = 0; i < _k; i++)
{
int t = f[i+j] + a[i] * r[j] + c;
f[i+j] = t%10;
c = t/10;
}
f[i+j] += c;
}
for(int u = 0; u < (i+j); u++)
a[u] = f[u];
_k = i+j;
}
if(flag == 0)
{
int i, j;
for(i = 199; a[i] == 0; i--);
for(j = 0; a[j] == 0; j++);
for(; i >= j; i--)
printf("%d", a[i]);
}
else if(flag == 1)
{
int i,j,v;
for(i = 198; i >= dotpos; i--)
a[i+1]=a[i];
a[dotpos] = -1;
for(i = 199; a[i] == 0 || a[i] == -1; i--);
for(j = 0; a[j] == 0 || a[j] == -1; j++);
if(dotpos > i)
{
printf(".");
for(v = dotpos-1; v >= j; v--)
printf("%d", a[v]);
}
if(dotpos < j)
{
for(v = i; v>dotpos; v--)
printf("%d", a[v]);
}
if(dotpos > j && dotpos < i)
{
for(v = i; v >= j; v--)
if(a[v]==-1)
printf(".");
else
printf("%d", a[v]);
}
}
printf("\n");
}
return 0;
}
此题难倒是不难,关键在于情况比较复杂。
首先,大数乘法不再是两个数而已,而是n次方。因此在循环的过程中一定要注意被乘数的更新。
其次,最后的输出环节很容易出错。根据题目,有很多要求。写着写着人就糊涂了。。最后我选择了一种比较浪费时间空间却能简化逻辑的算法,还好ac了。
第三,数组得开大些,要不然装不下结果。
第四,用数组处理大精度数据时,其存储顺序与数字顺序相反。什么时候减,什么时候加,需要注意!