题目名称 861. 阶乘
输入输出 fact4.in/out
难度等级
时间限制 1000 ms (1 s)
内存限制 128 MiB
测试数据 10
题目来源 Gravatarsywgz 于2012-07-09加入
开放分组 全部用户
提交状态
分类标签
USACO 基本 数论
分享题解
通过:145, 提交:420, 通过率:34.52%
GravatarTA 100 0.000 s 0.00 MiB Pascal
GravatarTanAp0k 100 0.000 s 0.00 MiB Pascal
Gravatar天空非翔 100 0.000 s 0.00 MiB Pascal
Gravatarcy 100 0.000 s 0.00 MiB C++
GravatarAAAAAAAAAA 100 0.000 s 0.00 MiB C++
GravatarRegnig Etalsnart 100 0.000 s 0.00 MiB C++
GravatarHarry Potter 100 0.000 s 0.00 MiB C++
Gravatarop_组撒头屯 100 0.000 s 0.00 MiB C++
Gravatar锝镆氪锂铽 100 0.000 s 0.00 MiB C++
Gravatarlihaoze 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位是一定可以的。。。
Gravatar邪恶的小法(zhi)师(zhan
2017-02-13 22:33 9楼
这题虽然做法和第1074题类似,但那道题数据好强。。这道题数据弱爆。。。
GravatarTA
2013-11-02 21:43 8楼
只记最后一位对于2*5向前进位时次位由于数据缺失会导致答案不对。
因此保留位数应保证进位答案无丢失,在这里,由于数据范围为千。
故须保留4位。
Gravatar超级傲娇的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;
}
Gravatar超级傲娇的AC酱
2013-10-03 09:32 6楼
每次乘的时候保留5位(不包括0)就行了。。。略不严谨
Gravatarraywzy
2013-05-30 23:03 5楼
第一次交的那个请无视。。。
Gravatar苏轼
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并计算末位。
GravatarTruth.Cirno
2012-11-02 17:09 3楼
水题,虽然跪了几次
Gravatarcstdio
2012-10-31 19:44 2楼
这是水题..
Gravatar11111111
2012-10-30 11:18 1楼

861. 阶乘

★   输入文件:fact4.in   输出文件:fact4.out   简单对比
时间限制:1 s   内存限制:128 MiB

【题目描述】

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