原帖及讨论:http://bbs.bc-cn.net/dispbbs.asp?boardID=5&ID=152507 前两个月跟论坛上的laigaoat2005说了一道计算阶乘的题,那时随便写了下没写出合适的,就放在一边了。 昨天跟laigaoat2005聊天又谈到这个问题,决定重新写一下这个代码,于是就有了下面的代码。 在代码中我把内存申请系数设置为4,可以计算10000以内的阶乘,如果需要计算更大的数,则需要将该系数适当增大。刚才在自己的机子上测试计算100000的阶乘,结果因为计算量太大花的时间太长而中途手动中止,哪位朋友的机子性能好有兴趣的话可以算一下100000的阶乘。 不知道有没有高效的计算方法,我总觉得自己的算法效率不高,欢迎大家指点。 /* Factorial.c -- 计算大数的阶乘 * Author: Space * Date: 2007/07/03 * Version: 1.0 */ #include<stdio.h> #include<stdlib.h> // for malloc() #include<string.h> // for memset() #define QUOTIETY 4 // 内存分配系数,计算10000以内阶乘设置为4就足够,如果需要 // 计算更大的数的阶乘,则将该系数适当增大 void process(const int index, int *result); int cnt = 1; int main(void) { int index = 0; int input = 0; int *result = NULL; // 获得输入数据 printf("请输入你要计算的阶乘数,内存有限,请不要超过10000:/n"); scanf("%d", &input); while (input <= 0 || input > 10000) { printf("请输入合理的数据,谢谢:/n"); scanf("%d", &input); } // 申请空间储存计算结果 result = (int *)malloc(sizeof(int) * input * QUOTIETY); if (result == NULL) { printf("内存申请失败!/n"); exit(-1); } memset(result, 0, sizeof(int) * input * QUOTIETY); // 初始化存储空间 result[0] = 1; // 进行阶乘计算 for ( index = 1; index <= input; ++index) { process(index, result); } // 打印结果 for (index = cnt - 1; index >= 0L; --index) { printf("%d", result[index]); } putchar('/n'); printf("结果一共有%d位数!/n", cnt); free(result); return 0; } /* * 计算阶乘核心代码 */ void process(const int index, int *result) { int product = 0; // 乘积 int carry = 0; // 进位 int remainder = 0; // 余数 int i = 0; for (i = 0; i < cnt; ++i) { product = result[i] * index + carry; carry = product / 10; remainder = product % 10; result[i] = remainder; } if (carry != 0) { while (carry / 10 != 0) { result[cnt] = carry % 10; carry /= 10; ++cnt; } result[cnt++] = carry; } } |