题目名称 | 861. 阶乘 |
---|---|
输入输出 | fact4.in/out |
难度等级 | ★ |
时间限制 | 1000 ms (1 s) |
内存限制 | 128 MiB |
测试数据 | 10 |
题目来源 | sywgz 于2012-07-09加入 |
开放分组 | 全部用户 |
提交状态 | |
分类标签 | |
分享题解 |
通过:145, 提交:420, 通过率:34.52% | ||||
TA | 100 | 0.000 s | 0.00 MiB | Pascal |
TanAp0k | 100 | 0.000 s | 0.00 MiB | Pascal |
天空非翔 | 100 | 0.000 s | 0.00 MiB | Pascal |
cy | 100 | 0.000 s | 0.00 MiB | C++ |
AAAAAAAAAA | 100 | 0.000 s | 0.00 MiB | C++ |
Regnig Etalsnart | 100 | 0.000 s | 0.00 MiB | C++ |
Harry Potter | 100 | 0.000 s | 0.00 MiB | C++ |
op_组撒头屯 | 100 | 0.000 s | 0.00 MiB | C++ |
锝镆氪锂铽 | 100 | 0.000 s | 0.00 MiB | C++ |
lihaoze | 100 | 0.000 s | 0.00 MiB | C++ |
关于 阶乘 的近10条评论(全部评论) | ||||
---|---|---|---|---|
关于保留位数的证明:
存在x*y==z*(10^k)(x个位不为零)(y<=4220)(z是普通的正整数) 因为10^k中的质因数只有2和5(10^k == 2^k * 5^k),所以,当x可以整除2^k,y可以整除5^k时,才会存在x*y==z。而形如N!/ 10^p的数(N!/ 10^p的个位数字不为0),其中一定没有质因数5,所以x只能是2^k,y只能是5^k。 而y<=4220<5^6 所以保留5位是一定可以的。。。
邪恶的小法(zhi)师(zhan
2017-02-13 22:33
9楼
| ||||
这题虽然做法和第1074题类似,但那道题数据好强。。这道题数据弱爆。。。
| ||||
只记最后一位对于2*5向前进位时次位由于数据缺失会导致答案不对。
因此保留位数应保证进位答案无丢失,在这里,由于数据范围为千。 故须保留4位。
超级傲娇的AC酱
2013-10-03 09:41
7楼
| ||||
每次阶乘保留一位为何答案有时会错。。。
#include <iostream> using namespace std; int main(int argc, const char * argv[]) { long long i,n,ans=1; cin>>n; for(i=1;i<=n;i++) { ans*=i; while(ans%10==0) ans/=10; if(ans>=10) ans%=10; } cout<<ans; return 0; }
超级傲娇的AC酱
2013-10-03 09:32
6楼
| ||||
每次乘的时候保留5位(不包括0)就行了。。。略不严谨
raywzy
2013-05-30 23:03
5楼
| ||||
第一次交的那个请无视。。。
苏轼
2013-03-24 12:07
4楼
| ||||
为何我只想到了用高精度
摘自NOCOW: 简单的把末尾的0去掉是不行的,因为我们不知道现在不是0的位会不会乘上下一个数之后就变成0了。 因为10=2*5,所以每有一个0就有一对2*5=10出现,反之,如果这个数的质因数分解没有成对的2,5,我们就可以简单的对10求模,而不用管前面的数字,因为它一定不会产生0。 所以我们只要在处理阶乘的时候消掉所有成对的2和5就行了,容易理解,N!的质因数分解式里因子2远比5要多,所以只需要记录因子2的个数,有因子5就消掉,最后再把2乘回去就行了。 可以直接用高精度乘法计算,5000位就够了,每位存储一个四位数,打印时处理一下。 甚至可以连高精度都不用,用一个变量j记录i!的最后四位末尾非零数,在计算(i+1)!时只需要计算(i+1)*j即可。 更简洁的方法是,一遍循环消除5并记录5的个数,第二遍循环消除同样个数的2并计算末位。 | ||||
水题,虽然跪了几次
| ||||
这是水题..
|
N的阶乘写作N!表示小于等于N的所有正整数的乘积。阶乘会很快的变大,如13!就必须用32位整数类型来存储,70!即使用浮点数也存不下了。你的任务是找到阶乘最后面的非零位。举个例子,5!=1*2*3*4*5=120所以5!的最后面的非零位是2,7!=1*2*3*4*5*6*7=5040,所以最后面的非零位是4。
共一行,一个整数不大于 4220 的整数N。
共一行,输出N!最后面的非零位。
7
4