每日一算法:大数的阶乘
2013-10-24 20:08
190 查看
由于int有其本身的范围,所以,求阶乘很容易溢出
为此
我们用一个数组a
来存放阶乘结果的每一位,阶乘从1开始,a[0] = 1
1*2 = 2; a[0] = 2;
2*3 = 6; a[0] = 6;
6*4 = 24; a[0] = 4,a[1] = 2;
24 * 5 = 120 a[0] * 5 = 20,2进位,a[0] = 0, a[1] * 5 = 10,1进位,a[1] = 0+2 = 2; a[2] = 2;
120*6 = 720 a[0] * 6 = 0,a[0] = 0, a[1] * 6 = 12,1进位,a[1] = 2; a[2] * 6 = 6,在加上进位的1,也就是a[2] = 6+1 = 7
后面一样....................................................................
为此,我们需要两个循环,从1....n,n的阶乘
存储结果后的数组有多少位参与运算,1....total
还需设置一个进位标志flag。
为此
我们用一个数组a
来存放阶乘结果的每一位,阶乘从1开始,a[0] = 1
1*2 = 2; a[0] = 2;
2*3 = 6; a[0] = 6;
6*4 = 24; a[0] = 4,a[1] = 2;
24 * 5 = 120 a[0] * 5 = 20,2进位,a[0] = 0, a[1] * 5 = 10,1进位,a[1] = 0+2 = 2; a[2] = 2;
120*6 = 720 a[0] * 6 = 0,a[0] = 0, a[1] * 6 = 12,1进位,a[1] = 2; a[2] * 6 = 6,在加上进位的1,也就是a[2] = 6+1 = 7
后面一样....................................................................
为此,我们需要两个循环,从1....n,n的阶乘
存储结果后的数组有多少位参与运算,1....total
还需设置一个进位标志flag。
#include <stdio.h> char per[1000000]; /*保存结果的每一个位*/ int total; /*结果的位数*/ void fact(int num) { int i,j,flag,temp; /*flag是进位标志*/ per[0] = 1; total = 1; for (i=1,flag = 0; i<=num; i++) { for (j=0,temp = 0; j<total; j++) { temp = per[j] * i + flag; /*数组的每一位与i相乘*/ per[j] = temp % 10; /*每一位小于10*/ flag = temp / 10; /*所进的位数*/ } while (flag) { per[total] = flag % 10; total++; flag = flag / 10; } } } int main() { int i, number; printf("Please input a number:"); scanf("%d",&number); fact(number); printf("%d! = ",number); for (i=total-1; i>=0; i--) { printf("%d",per[i]); } printf("\n一共%d位!\n",total); return 0; }
相关文章推荐
- WV.24-大数阶乘算法4-近似计算之二
- 2018年全国多校算法寒假训练营练习比赛(第三场)进击吧!阶乘 (大数阶乘)
- WV.25-大数阶乘算法5-程序运行时间的测量
- WV.26-大数阶乘算法6-入门篇之一
- 2018年全国多校算法寒假训练营练习比赛(第三场)---E---题(大数阶乘(模板题)c++/java/py)
- 2018年全国多校算法寒假训练营练习比赛(第三场)E---进击吧!阶乘(Java代码,另附Java解决大数问题的模板)
- 探讨大数阶乘的算法
- 2018年全国多校算法寒假训练营练习比赛(第三场)E-进击吧!阶乘(大数问题)
- N的阶乘(大数阶乘算法)
- WV.27-大数阶乘算法7-入门篇之二
- VBS函数应用--求大数的阶乘的算法
- 10000的阶乘的算法(大数的阶乘)
- WV.28-大数阶乘算法8-入门篇之三汇编的威力
- 求大数阶乘算法(华为2015面试题)
- 大数阶乘的算法
- 10000的阶乘的算法(大数的阶乘)
- 杭电acm1042题目:大数阶乘算法实现及优化
- 每日算法之大数加法
- 另一种求大数阶乘的算法
- WV.30-大数阶乘算法10-用Stirling逼近近似计算阶乘的探讨与应用