求大数40000阶乘
来源:互联网 发布:产品经理必备的软件 编辑:程序博客网 时间:2024/05/11 22:23
近来在看算法导论,编译原理方面的书籍,想起写些小玩意就当休闲了,以下是截图
C
代码如下:
- #include <stdio.h>
- #include <malloc.h>
- #include <time.h>
- void main(void)
- {
- int* Data = malloc(50000*sizeof(int)); //大数的阶乘位数数组如果用数组来存已超过1M堆栈的空间,所以这里用动态存储,预计计算结果不超过100000个数据元素,一个数据元素中最大存储值不大于46340,即最终最大的阶乘值最多可以达到231700000位(天文数字)
- int Digit; //数据位数变量
- int i,j,r,k; //循环计数器变量
- int N; //用户输入要求阶乘的值
- time_t starttime;
- time_t endtime;
- time_t elapsetime;
- for (i = 1; i < 50000+1; i++)
- {
- Data[i] = 0;
- }
- Data[0] = 1; //0位为标志位1
- Data[1] = 1; //1位为标志位1
- Digit = 1; //数据位为1,代表大数组中已有几个数组元素作为数据位了
- printf("Enter a number what you want to calculus : ");
- scanf("%d", &N); //读取欲求N值
- time(&starttime); //time start
- for (i = 1; i < N+1; i++)
- {
- for (j = 1; j < Digit+1; j++)
- {
- Data[j] *= i; //数组元素中已有位(数据位)的内容运算
- }
- //转换为46340进制
- for (j = 1; j < Digit+1; j++)
- {
- if (Data[j] > 46340) //每一位达到46340时,就考虑进位问题(即46340进制),因为在x86 32位os中int型的最大正值是2的31次方减一即2147483647,考虑到最大一个数据位乘46340以上时将超过int的最大范围(这里也说明可以求最大46340左右的数的阶乘),在这一块上可以进行优化(这里一个元素存储46340是否为了尽量使用一个int型所能存储的信息量,即节约了空间),例如修改成long型元素。
- {
- for (r = j; r < Digit+1; r++)
- {
- if (Data[Digit] > 46340) //动态增加一位,因为可能遇到最高位数据位是46339的情况,最多最高位位数计数器加一
- {
- Digit++;
- }
- Data[r+1] += Data[r]/46340; //进位
- Data[r] = Data[r]%46340; //留余
- }
- }
- }
- }
- printf("%d! = ", N);
- for (k = Digit; k > 0; k--)
- {
- printf("%d", Data[k]);
- }
- printf("/n");
- time(&endtime); //time end
- printf("start time : %d/n", starttime);
- printf("end time : %d/n", endtime);
- elapsetime = endtime - starttime;
- printf("elapsetime : %d/n", elapsetime);
- }
大数阶乘,大进制,数组,分治策略。思路可以借鉴到其他大数预算操作上。
- 求大数40000阶乘
- 对于大数求阶乘
- 大数求阶乘
- 大数阶乘求位数
- 求大数阶乘算法
- 大数求阶乘
- 求一个大数的阶乘
- 求大数阶乘位数方法
- 【java】求大数的阶乘
- ACM(1042) 求大数阶乘
- HDU-求大数的阶乘
- C语言求大数阶乘
- java求大数的阶乘
- 数组法求大数阶乘
- 大数运算(7)——大数阶乘(求阶乘)
- C语言实现求大数阶乘
- 求大数阶乘结果的位数
- 求大数的阶乘方法(数组)
- 最易被商家“掺毒”的十五种食品
- winrar命令打包文件执行方式一例
- win2000server IIS和tomcat5多站点配置
- 查询从一个表中返回所有记录不在另外一个表中的结果集的方法
- Sample forms authentication test in C# (纯c# 代码 forms authentication)
- 求大数40000阶乘
- 周杰伦经典歌词
- C++中异常处理中的构造和析构
- oracle 修改 sequence 数值
- 一段调用游戏call的代码
- ★什么是index的leading column(索引的前导列)?
- 基于工作流的协同管理客户价值
- C# 移动TreeView的节点的类.
- 一个非常经典的ERP教程