Gravatar
邪恶的小法(zhi)师(zhan
积分:93
提交:34 / 76
关于保留位数的证明:
存在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位是一定可以的。。。

题目 861 阶乘
2017-02-13 22:33:13
Gravatar
TA
积分:891
提交:582 / 1147
这题虽然做法和第1074题类似,但那道题数据好强。。这道题数据弱爆。。。

题目 861 阶乘 AAAAAAAAAA
2013-11-02 21:43:30
Gravatar
超级傲娇的AC酱
积分:646
提交:244 / 660
只记最后一位对于2*5向前进位时次位由于数据缺失会导致答案不对。
因此保留位数应保证进位答案无丢失,在这里,由于数据范围为千。
故须保留4位。

题目 861 阶乘
2013-10-03 09:41:38
Gravatar
超级傲娇的AC酱
积分:646
提交:244 / 660
每次阶乘保留一位为何答案有时会错。。。
#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;
}

题目 861 阶乘
2013-10-03 09:32:02
Gravatar
raywzy
积分:715
提交:235 / 509
每次乘的时候保留5位(不包括0)就行了。。。略不严谨

题目 861 阶乘
2013-05-30 23:03:40
Gravatar
苏轼
积分:1509
提交:515 / 919
第一次交的那个请无视。。。

题目 861 阶乘
2013-03-24 12:07:22
Gravatar
Truth.Cirno
积分:1589
提交:557 / 1253
为何我只想到了用高精
摘自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并计算末位。

题目 861 阶乘 AAAAAAAAAA
2012-11-02 17:09:56
Gravatar
cstdio
积分:4755
提交:1198 / 2108
水题,虽然跪了几次

题目 861 阶乘 AAAAAAAAAA
2012-10-31 19:44:21
Gravatar
11111111
积分:636
提交:170 / 399
这是水题..

题目 861 阶乘 AAAAAAAAAA
2012-10-30 11:18:08