POJ 1001

#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了。

第三,数组得开大些,要不然装不下结果。

第四,用数组处理大精度数据时,其存储顺序与数字顺序相反。什么时候减,什么时候加,需要注意!

原文地址:https://www.cnblogs.com/ShaneZhang/p/2100443.html