大数阶乘--------------------------南阳理工学院题目28-CSDN博客

86 阅读1分钟

题目链接:南阳理工学院(虽然我不是在这个OJ提交的,另一个不便透漏)

大家都阶乘结果递增很快,若int存数据,很容易溢出,怎么办,怎么办?

曾经和大神一块写题时,我发现他用过10000进制。我做这道大数阶乘题时就试了试,没想到效果这么好,计算速度超级快,而且数据可以很大很大。不信看下面

用一个一维数组表示一个大数,下标从0,1,2,3,...意为从低位到高位。数组中的每一个元素都表示一个10000进制的位。

例如:12! = 479001600. 那么用数组bit表示 bit(1600, 7900, 4). 

下面代码解释:输入n,输出n!.

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>
const int N = 5000, BASE = 10000;
int bit[N]; //1w进制 
int main()
{
	int n;
	while (~scanf("%d", &n)) {
		memset(bit, 0, sizeof bit);
		int i, len = 1; //len表示有多少位 
		bit[0] = 1;//0, 1, 3,..低位到高位
		for (int b = 2; b <= n; ++b) {
			int c = 0; //进位c 
			for (i = 0; i < len; ++i) { //起初这里用b[i] == 0作为循环终止条件,当n=20是,n!低4位为0,循环终止 :), 哈哈
				bit[i] = bit[i] * b + c; c = 0;
				if (bit[i] >= BASE) {
					c = bit[i] / BASE;
					bit[i] %= BASE;
				}
			}
			if(c) bit[len++] += c;
		}
		i = len - 1;
		printf("%d", bit[i--]);
		for (; i >= 0; --i) {
			printf("%04d", bit[i]);
		}
		puts("");
	}

	return 0;
}


\