#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了。
第三,数组得开大些,要不然装不下结果。
第四,用数组处理大精度数据时,其存储顺序与数字顺序相反。什么时候减,什么时候加,需要注意!