每日一算法:大数的阶乘

举报
悦来客栈的老板 发表于 2020/12/29 00:26:22 2020/12/29
【摘要】 由于int有其本身的范围,所以,求阶乘很容易溢出 为此 我们用一个数组a[n]来存放阶乘结果的每一位,阶乘从1开始,a[0] = 1 1*2 = 2;       a[0] = 2; 2*3 = 6;       a[0] = 6; 6*4 = 24;      a...

由于int有其本身的范围,所以,求阶乘很容易溢出


为此

我们用一个数组a[n]来存放阶乘结果的每一位,阶乘从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。



  
  1. #include <stdio.h>
  2. char per[1000000]; /*保存结果的每一个位*/
  3. int total; /*结果的位数*/
  4. void fact(int num)
  5. {
  6. int i,j,flag,temp; /*flag是进位标志*/
  7. per[0] = 1;
  8. total = 1;
  9. for (i=1,flag = 0; i<=num; i++)
  10. {
  11. for (j=0,temp = 0; j<total; j++)
  12. {
  13. temp = per[j] * i + flag; /*数组的每一位与i相乘*/
  14. per[j] = temp % 10; /*每一位小于10*/
  15. flag = temp / 10; /*所进的位数*/
  16. }
  17. while (flag)
  18. {
  19. per[total] = flag % 10;
  20. total++;
  21. flag = flag / 10;
  22. }
  23. }
  24. }
  25. int main()
  26. {
  27. int i, number;
  28. printf("Please input a number:");
  29. scanf("%d",&number);
  30. fact(number);
  31. printf("%d! = ",number);
  32. for (i=total-1; i>=0; i--)
  33. {
  34. printf("%d",per[i]);
  35. }
  36. printf("\n一共%d位!\n",total);
  37. return 0;
  38. }

 

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/13004333

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。