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

来源:互联网 发布:哔哩哔哩动画mac下载 编辑:程序博客网 时间:2024/05/31 19:03

题目链接:南阳理工学院(虽然我不是在这个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;}


原创粉丝点击