加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

另一种求大数阶乘的算法

发布时间:2020-12-14 03:55:41 所属栏目:大数据 来源:网络整理
导读:大数阶乘 ?? ? 问题描述:编写程序,对给定的n(n = 100),计算并输出k的阶乘k!的全部有效数字。 ????注意:如果要求一个5的阶乘,用整型可以存储,求10的阶乘可以用长整型表示,但若要求100的阶乘,就无法用长整型表示,此时就必须考虑别的方法。 ??? 要求的k

大数阶乘

??? 问题描述:编写程序,对给定的n(n <= 100),计算并输出k的阶乘k!的全部有效数字。

????注意:如果要求一个5的阶乘,用整型可以存储,求10的阶乘可以用长整型表示,但若要求100的阶乘,就无法用长整型表示,此时就必须考虑别的方法。

??? 要求的k!的值,必定已求得(k-1)!的值,依次地推,当 k = 2时,要求的1! = 1为已知。求得(k-1)!的值后,对(k-1)!连续累加k-1此后即可求得K!值。

??? 例如:5!= 120,计算6!,可对原来的120累加5次120后得到720.

?? 由于k!可能大大超出一般整数的位数,因此程序用一个一维数组存储长整型,存储长整数数组的每个元素只存储长整数的一位数字。如有m位长整数N用数组a[]存储,并用a[0]存储长整数N的位数m,即a[0] = m。按上述约定,数组的每个元素存储k的阶乘k!的一位数字,并从低位到高位依次存于数组的第二个元素、第三个元素....

? 例如:6! = 720,在数组中的存储形式为:

?a[0]?????? a[1]??????? a[2]???? a[3]

? 3?????????0?????????? 2?? ?????7

?a[0] = 3表示长整数是一个3位数,接着从低位到高位依次是0、2、7,表示成整数720.

程序实现:

[cpp]? view plain copy
  1. /*?
  2. ?*程序功能:计算任意位数的阶乘?
  3. ?*作者Blog:http://blog.csdn.net/u012027907?
  4. ?*/??
  5. #include?<stdio.h>??
  6. #include?<malloc.h>??
  7. #define?MAXN?1000??
  8. ??
  9. //已知a中的(k-1)!,求k!??
  10. void?PreNext(int?a[],int?k)???
  11. {??
  12. ????int?*b,m?=?a[0],i,j,r,carry;??
  13. ????b?=?(int*)malloc(sizeof(int)*(m+1));??
  14. ????for(i?=?1;?i?<=?m;?i++)????
  15. ????????b[i]?=?a[i];??
  16. for(j?=?1;?j?<?k;?j++)???//控制累加k-1次??
  17. ????{??
  18. ????????for(carry=0,i?=?1;i?<=?m;i++)??
  19. ????????{??
  20. ????????????r?=?(i?<=?a[0]?a[i]+b[i]:a[i])+carry;?//计算加的结果??
  21. ????????????a[i]?=?r?%?10;?//计算本位结果??
  22. ????????????carry?=?r?/?10;?//计算进位数字??
  23. ????????}??
  24. if(carry)??//向最高为进位??
  25. ????????????a[++m]?=?carry;??
  26. ????}??
  27. ????free(b);??
  28. ????a[0]?=?m;??
  29. }??
  30. void?Print(int?*a,87); background-color:inherit; font-weight:bold">int?k)??
  31. int?i;??
  32. ????int?m?=?0;??
  33. for(i?=?a[0];?i?>0;?i--){??
  34. ????????printf("%d",a[i]);??
  35. ????????m++;??
  36. ????????if(m?%?5?==?0)?????????????//每5个数字空一格?????
  37. ????????????printf("?");????
  38. if(40?==?m)????????????????//每行输出40个数字?????
  39. ????????{????
  40. ????????????printf("n");????
  41. ????????????m?=?0;????????????
  42. ????printf("n");??
  43. }??
  44. void?main()??
  45. {??
  46. int?a[MAXN],n,k;??
  47. ????n?=?1;??
  48. ????printf("本程序计算任意位数的阶乘!n");??
  49. ??????
  50. ????while(n){??
  51. ????????printf("请输入一个数:");??
  52. ????????scanf("%d",&n);??
  53. ????????a[0]?=?a[1]?=?1;??
  54. for(k?=?2;?k?<=?n;?k++)??
  55. ????????{??
  56. ????????????PreNext(a,k);?????????
  57. ????????????if(k?==?n)??
  58. ????????????????Print(a,k);??
  59. ????????}??
  60. ????}??
  61. }??

运行截图:

转载请标明出处:http://blog.csdn.net/u012027907

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读