HDOJ 1042 N!

原题链接

10000!大概有35660位。

开始我把数组只开到27000位,结果老是WA,后来百度了一下10000!的位数才发现自己数学太捉急了。

大概应该这样算,1000到9999共9000 * 3 = 27000个0;100到999共900 * 2 = 1800个0;10!是7位,这样非末尾0相乘共有1000*7=7000位,综上,合计位数大约35000多位,保险起见,数组开到40000;


附ac代码:

#include <stdio.h>
#include <string.h>
#define MAX 40000
int A[MAX];

int find(){
	int i = MAX;
	while(!A[--i])
		;
	return i;
}

int main(){
	int n, i, j, k, m;
	while(scanf("%d", &n) == 1){
		if(n < 2){
			printf("1\n");
			continue;
		}		
		memset(A, 0, sizeof(A));
		A[0] = 1;  //A[0]是最低位
		for(i = 2; i <= n; ++i){
			k = find();
			for(j = 0; j <= k; ++j){
				A[j] *= i;
				//在完成一轮乘法后再进位		
			}
			//处理进位
			for(m = 0; m <= k || A[m] > 9; ++m)
				if(A[m] > 9)
					A[m + 1] += A[m] / 10, A[m] %= 10;
		}
		k = find();
		for(i = k; i >= 0; --i)
			printf("%d", A[i]);
		printf("\n");
	}
	return 0;
}


posted on 2014-02-14 11:12  长木Qiu  阅读(227)  评论(0编辑  收藏  举报