关于保留位数的证明:
存在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
|
|
这题虽然做法和第1074题类似,但那道题数据好强。。这道题数据弱爆。。。
|
|
只记最后一位对于2*5向前进位时次位由于数据缺失会导致答案不对。
因此保留位数应保证进位答案无丢失,在这里,由于数据范围为千。 故须保留4位。
题目 861 阶乘
2013-10-03 09:41:38
|
|
每次阶乘保留一位为何答案有时会错。。。
#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
|
|
每次乘的时候保留5位(不包括0)就行了。。。略不严谨
题目 861 阶乘
2013-05-30 23:03:40
|
|
第一次交的那个请无视。。。
题目 861 阶乘
2013-03-24 12:07:22
|
|
为何我只想到了用高精度
摘自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并计算末位。 |
|
水题,虽然跪了几次
|
|
这是水题..
|