【GZOJ】1372——阶乘
来源:互联网 发布:淘宝附近的人在哪查看 编辑:程序博客网 时间:2024/06/18 12:48
题目链接:广大OJ1372
本题亦为广大15级第一次周赛的J题。
题目内容
Problem Description
阶乘的计算公式是:n!=1*2*3*4*5*……*n
例如说,2的阶乘是2,3的阶乘是6
现在要做的程序是,输入一个数n,输出n的阶乘。
Input
多组输入数据。
每组输入数据占一行,为一个整数n(1<=n<=5000)
Output
对于每组输入,输出n的阶乘,占一行。
Sample Input
3
2
Sample Output
6
2
Hint
注意细节。
解题思路
所谓细节就是,n的最大值可以是5000。这意味着n的阶乘会非常大,大到连long long都无法储存。
对于这种题,用Java的大整数类解决无疑是最方便也是最快的。不过这里讨论的是C或者C++的解法,也就是高精度算法中的大整数数乘以小整数。
高精度算法的核心思想就是,使用一个数组来储存一个大数,按位储存。
例如说,用这个方法储存数字182738,就可以建一个数组a[],令a[0]=1,a[1]=8,a[2]=2,a[3]=7,a[4]=3,a[5]=8。当然也可以反过来(反过来的话计算会方便一些)。
然后是高精度数字的计算方法。高精度数字的加减乘除其实可以参考我们小学所学的竖式运算方式,容易理解而已也很好用。(所以我们小学是学了什么不得了的东西了吗= =)
例如说这道题需要到的大整数乘以小整数,以1872381*8为例。
按照竖式运算,乘法是从个位开始进行逐位乘上去的(所以反向储存就比较方便),然后遇到乘积大于10的就要进位。按照这样的方法我们可以这么计算:
答案的个位是1*8=8,无需进位。
答案的十位是8*8=64,需进位6,答案修正为4。
答案的百位是3*8+6=30,需进位3,答案修正为0。
答案的千位是2*8+3=19,需进位1,答案修正为9。
答案的万位是7*8+1=57,需进位5,答案修正为7。
答案的十万位是8*8+5=69,需进位6,答案修正为9。
答案的百万位是1*8+6=14,需进位1,答案修正为4。
由于还存在进位,所以答案有了千万位,为1。
将这些为连起来就是答案:14979048。
上述方法其实就是小学的竖式运算的步骤。只需要贯彻“按位储存”的思想,以及不要忽视进位就可以了。
阶乘的计算便无需多说了,就是高精度乘法的多次调用而已。
代码
#include<iostream>using namespace std;void f(int *a,int n,int &al)//这里的大整数是用数组a反向储存{ for(int i=2;i<=n;i++)//让a从2乘到n { int p=0,j;//变量p用于储存进位,初始化为0 for(j=0;j<al||p!=0;j++)//当进位不为0时还需继续运算 { a[j]*=i; a[j]+=p; p=0; if(a[j]>10)//是否需要进位 { p=a[j]/10; a[j]%=10; } } al=j;//重置长度 }}int main(){ int n; while(cin>>n) { int a[100000]={0}; a[0]=1; int al=1; f(a,n,al);//变量al用于储存数组长度 for(int i=al-1;i>=0;i--)cout<<a[i];//倒序输出 cout<<endl; }}
- 【GZOJ】1372——阶乘
- 【GZOJ】1367——A*B问题
- 【GZOJ】1368——爱迪生的烦恼
- 【GZOJ】1371——杨辉三角
- 【GZOJ】1374——口袋妖怪对战
- 【GZOJ】1308——开灯关灯
- 【GZOJ】1314——异或最大值
- 【GZOJ】1369——小明跳楼梯
- 【GZOJ】1370——名为F的数列
- 【GZOJ】1373——凹酱的行程
- BidInteger——阶乘
- 阶乘因式分解(—)
- 大数运算(7)——大数阶乘(求阶乘)
- java 阶乘——递归
- 阶乘之和——贪心
- python 递归——阶乘
- 阶乘——高精度求法
- 大数存储——阶乘
- Object-c之id ,instancetype,SEL,_cmd;self,super几种类型的区别及用法
- uitableView高度自适应
- FlyCapture2相机的连接和图像采集
- 黑马程序员——Java继承——多线程(二)
- adb出错 adb not responding 解决方法
- 【GZOJ】1372——阶乘
- 将文件内容隐藏在bmp位图中
- 一个简单的对话框JDialog
- MySQL的几种优化方法
- java中如何防止类被初始化(实例化)?
- 简化的以,号分隔为SQLtable
- rapidjson使用总结
- html网页框架
- 统计学习方法 --- 感知机模型原理及c++实现