对于大数来说,一个数的阶乘是非常大的,同样,一个int类型的整数,他的阶乘就有可能会很大。

就拿50来说,他的阶乘位数是65位,就已经远远超过了long long int类型的最大值。这时候,我们要通过字符串的方法,来进行阶乘的运算。

当然,需要注意的是:

我们所求一个数的阶乘,这个数是在int范围内的,5000的阶乘位数是16326位。

其方法是:

首先,我们是可以先求一定范围内的最大值的阶乘位数,以便于申请数组空间的确定。

对于大数问题,我们要有将大数与数组结合的思想,可以利用类似于人工求值的方法求出有关大数的问题。

对于大数阶乘来说,最重要的是如何将每个数的每位数与相对应的数组元素储存起来,就如算50的阶乘,我们要先从1开始乘:

1*2=2,将2存到a[0]中,

接下来是用a[0]*3;

2*3=6,将6储存在a[0]中,

接下来是用a[0]*4;

6*4=24,是两位数,那么24%10==4存到a[0]中,24/10==2存到a[1]中,

接下来是用a[0]*5;a[1]*5+num(如果前一位相乘结果位数是两位数,那么num就等于十位上的那个数字;如果是一位数,num==0)

24*5=120,是三位数,那么120%10==0存到a[0]中,120/10%10==2存到a[1]中,120/100==1存到a[2]中,

接下来是用a[0]*3;a[1]*6+num;a[2]*6+num;

120*6=720,那么720%10==0存到a[0]中,720/10%10==2存到a[1]中,720/100==7存到a[2]中,

...................

直到乘到50,将每一位数储存为止。

下面是C语言代码实现:

#include <stdio.h>
int main()
{  int a[20001];//储存每一位所得到的数   int temp,digit,n,i,j=0;//temp每次的得数   digit每次得数的位数    scanf("%d",&n);  a[0]=1;//从1开始乘   digit=1;//位数从第一位开始   for(i=2;i<=n;i++)  {  int num=0;  for(j=0;j<digit;j++)   {  temp=a[j]*i+num;//将一个数的每一位数都分别乘以i,   a[j]=temp%10;//将一个数的每一位数利用数组进行储存  num=temp/10;  }  while(num)//判断退出循环后,num的值是否为0   {  a[digit]=num%10;//继续储存   num=num/10;  digit++;  }  }  for(i=digit-1;i>=0;i--)//倒序输出每一位   printf("%d",a[i]);  printf("\n");  return 0;
}

大数运算(7)——大数阶乘(求阶乘)相关推荐

  1. 数据结构实验--大数运算之计算n的阶乘 (n≥20)

    一.问题描述 大数运算--计算n的阶乘 (n≥20). [基本要求] (1)数据的表示和存储: ①累积运算的中间结果和最终的计算结果的数据类型要求是整型--这是问题本身的要求. ②试设计合适的存储结构 ...

  2. 大数运算(6)——大数阶乘(求位数)

    对于求一个大数的阶乘的位数一般有两种方法: 第一种: lg(N!)=[lg(N*(N-1)*(N-2)*......*3*2*1)]+1 =[lgN+lg(N-1)+lg(N-2)+......+lg ...

  3. 大数运算(8)——大数幂运算

    大数幂运算的实现有了前面的大数乘法算法做铺垫,就是调用乘法函数,来循环去自乘,幂指数相应减1,直到幂指数变为0时结束. 下面是C语言代码实现: #include<stdio.h> #inc ...

  4. 大数运算(5)——大数除法(取模、取余)

    有关于大数除法的运算可以大致分为两种:一种是求商(取模),另一种是求余数(取余). 有两个大整数a和b,当a==b时,a/b==1,余数是0.(a!=0,b!=0) 当a>b时,a/b>= ...

  5. 大数运算(2)——大数加法

    /*大数加法的中心思想就是:模拟人工列竖式算加法的方法.先从最低位开始相加,判断是否进1,一直到最高位. 例如: 求12545642233+278545的和,该怎么算? 是这样的:      3  3 ...

  6. 大数运算(3)——大数减法

    大数的减法与大数加法的方法有相似之处的,都是模拟人工运算的,从最低位开始运算,一直到最高位. 其方法是: 首先,要判断减数和被减数哪一个位数长,减数位数长是正常减:被减数位数长,则被减数减减数,最后还 ...

  7. 大数运算(1)——大数储存

    int (16位) -32768-32767 (注:现在大多数的编译器的int型是32位的 也就是说跟long型的大小一样) long long或__int64(64位)     -922337203 ...

  8. 大数运算(4)——大数乘法

    首先说一下乘法计算的算法:同样是模拟人工计算时的方法. 从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘,记录结果之后,用第二位相乘,记录结果并且左移一位,以此类推,直到计算完最后 ...

  9. c语言n位水仙花数简书,Kotlin中函数式编程API(8)求阶乘和计算水仙花数

    求阶乘 计算水仙花数 前面介绍了很多函数,下面两个需求使用前面的函数将变得简单清晰. 一.求阶乘 求阶乘通常会使用递归函数调用,这比较影响性能,可以通过前面介绍的 reduce 函数实现. fun f ...

最新文章

  1. .NET UIAutomation实现Word文档加密暴力破解
  2. TypeScript 终极初学者指南
  3. java线程interrupt用法_Java线程中interrupt那点事 | 学步园
  4. C语言归并排序(合并排序)
  5. mac 显示隐藏文件的命令行和快捷键
  6. curve函数 roc_sklearn-roc_curve
  7. 190518每日一句
  8. back to wuxi
  9. [转]ASP.NET在线用户列表精确版—解决用户意外退出在线列表无法及时更新问
  10. html的选择字体样式代码,html 常用字体(示例代码)
  11. 积少成多Flash(4) - ActionScript 3.0 实例之Hello World, 时钟, 计时器
  12. windows 许可证即将过期,解决方案
  13. 洛谷P3717 [AHOI2017初中组]cover
  14. sass混合器,选择器的继承
  15. 年中Flag挑战日榜:最终挑战王会花落谁家?
  16. Pixelmator Pro for Mac(媲美PS的修图软件)
  17. QQ密技60招!(上)有的很有用!
  18. 很受打动的一篇文章,很幽默让人想看完。
  19. 未来流行遛机器狗,也许能解决城市宠物背后的矛盾
  20. Python垃圾收集机制

热门文章

  1. Docker 配置固定IP及桥接的实现方法(转载)
  2. 为ubuntu添加多媒体以及flash等等常用包
  3. WPF Converter 使用复杂参数的方法
  4. Python学习笔记:面向对象高级编程(中下)
  5. 打开流 fopen 、freopen和fdopen函数
  6. java多态替换switch_第1章 重构,第一个案例(3):运用多态取代switch
  7. [云炬创业管理笔记]第三章打造优秀创业团队讨论2
  8. [云炬创业管理笔记]第五章打磨最有效的商业模式测试4
  9. 获得北大新材料学院夏令营offer的艰险历程(附面试答辩PPT)
  10. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170402