大数运算(7)——大数阶乘(求阶乘)
对于大数来说,一个数的阶乘是非常大的,同样,一个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)——大数阶乘(求阶乘)相关推荐
- 数据结构实验--大数运算之计算n的阶乘 (n≥20)
一.问题描述 大数运算--计算n的阶乘 (n≥20). [基本要求] (1)数据的表示和存储: ①累积运算的中间结果和最终的计算结果的数据类型要求是整型--这是问题本身的要求. ②试设计合适的存储结构 ...
- 大数运算(6)——大数阶乘(求位数)
对于求一个大数的阶乘的位数一般有两种方法: 第一种: lg(N!)=[lg(N*(N-1)*(N-2)*......*3*2*1)]+1 =[lgN+lg(N-1)+lg(N-2)+......+lg ...
- 大数运算(8)——大数幂运算
大数幂运算的实现有了前面的大数乘法算法做铺垫,就是调用乘法函数,来循环去自乘,幂指数相应减1,直到幂指数变为0时结束. 下面是C语言代码实现: #include<stdio.h> #inc ...
- 大数运算(5)——大数除法(取模、取余)
有关于大数除法的运算可以大致分为两种:一种是求商(取模),另一种是求余数(取余). 有两个大整数a和b,当a==b时,a/b==1,余数是0.(a!=0,b!=0) 当a>b时,a/b>= ...
- 大数运算(2)——大数加法
/*大数加法的中心思想就是:模拟人工列竖式算加法的方法.先从最低位开始相加,判断是否进1,一直到最高位. 例如: 求12545642233+278545的和,该怎么算? 是这样的: 3 3 ...
- 大数运算(3)——大数减法
大数的减法与大数加法的方法有相似之处的,都是模拟人工运算的,从最低位开始运算,一直到最高位. 其方法是: 首先,要判断减数和被减数哪一个位数长,减数位数长是正常减:被减数位数长,则被减数减减数,最后还 ...
- 大数运算(1)——大数储存
int (16位) -32768-32767 (注:现在大多数的编译器的int型是32位的 也就是说跟long型的大小一样) long long或__int64(64位) -922337203 ...
- 大数运算(4)——大数乘法
首先说一下乘法计算的算法:同样是模拟人工计算时的方法. 从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘,记录结果之后,用第二位相乘,记录结果并且左移一位,以此类推,直到计算完最后 ...
- c语言n位水仙花数简书,Kotlin中函数式编程API(8)求阶乘和计算水仙花数
求阶乘 计算水仙花数 前面介绍了很多函数,下面两个需求使用前面的函数将变得简单清晰. 一.求阶乘 求阶乘通常会使用递归函数调用,这比较影响性能,可以通过前面介绍的 reduce 函数实现. fun f ...
最新文章
- .NET UIAutomation实现Word文档加密暴力破解
- TypeScript 终极初学者指南
- java线程interrupt用法_Java线程中interrupt那点事 | 学步园
- C语言归并排序(合并排序)
- mac 显示隐藏文件的命令行和快捷键
- curve函数 roc_sklearn-roc_curve
- 190518每日一句
- back to wuxi
- [转]ASP.NET在线用户列表精确版—解决用户意外退出在线列表无法及时更新问
- html的选择字体样式代码,html 常用字体(示例代码)
- 积少成多Flash(4) - ActionScript 3.0 实例之Hello World, 时钟, 计时器
- windows 许可证即将过期,解决方案
- 洛谷P3717 [AHOI2017初中组]cover
- sass混合器,选择器的继承
- 年中Flag挑战日榜:最终挑战王会花落谁家?
- Pixelmator Pro for Mac(媲美PS的修图软件)
- QQ密技60招!(上)有的很有用!
- 很受打动的一篇文章,很幽默让人想看完。
- 未来流行遛机器狗,也许能解决城市宠物背后的矛盾
- Python垃圾收集机制
热门文章
- Docker 配置固定IP及桥接的实现方法(转载)
- 为ubuntu添加多媒体以及flash等等常用包
- WPF Converter 使用复杂参数的方法
- Python学习笔记:面向对象高级编程(中下)
- 打开流 fopen 、freopen和fdopen函数
- java多态替换switch_第1章 重构,第一个案例(3):运用多态取代switch
- [云炬创业管理笔记]第三章打造优秀创业团队讨论2
- [云炬创业管理笔记]第五章打磨最有效的商业模式测试4
- 获得北大新材料学院夏令营offer的艰险历程(附面试答辩PPT)
- 学长毕业日记 :本科毕业论文写成博士论文的神操作20170402