测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A25281. nonzero问题描述小明最近对阶乘很感兴趣,但是阶乘增长的太快了。如13!就必须用32位整数类型来存储,70!即使浮点数也存不下。小明想知道阶乘最后面的非零位是多少。例如:5!=1*2*3*4*5=120,所以5!最后面的非零位是2。7!=1*2*3*4*5*6*7=5040,所以7!最后面的非零位是4。输入说明一行,一个整数N(N≤1000)。输出说明一行,输出N!最后面的非零位。样例输入7…

填空题 中等

题目描述

nonzero

问题描述

小明最近对阶乘很感兴趣,但是阶乘增长的太快了。如13!就必须用32位整数类型来存储,70!即使浮点数也存不下。小明想知道阶乘最后面的非零位是多少。

例如:5!=1*2*3*4*5=120,所以5!最后面的非零位是2。

7!=1*2*3*4*5*6*7=5040,所以7!最后面的非零位是4。

输入说明

一行,一个整数N(N≤1000)。

输出说明

一行,输出N!最后面的非零位。

样例输入

7

样例输出

4

参考答案

#include <iostream> using namespace std; int main() { int n; cin>>n; int lastdigit = 1; // 分离出所有的2和5之后的最后一位,一定不会为0。 int cnt2 = 0; // 统计有多少个2因子 for(int i=1; i<=n; i++) { int t=i; while(t%2 == 0) cnt2++, t /= 2; while(t%5 == 0) cnt2--, t /= 5; // 2*5=10,因此一个2因子和一个5因子抵消 lastdigit *= t; lastdigit %= 10; // 只需保留最后一位 } // 确定最后位(非0位)的数字 while(cnt2--) { lastdigit *= 2; // 整体乘2 lastdigit %= 10; // 只取最低位(防爆) } cout<<lastdigit<<endl; return 0; }

答案解析

直接维护最后一个非零为当然是错误的做法。但如果分离出所有的2和5的因子,剩下的最后一个非零数就不可能再变成0。时间复杂度:O(n)

上一题 下一题