1132: 去除n!末尾的0
时间: 2024-06-09 14:05:12 浏览: 80
要去除n!末尾的0,实际上就是要求n!中因子5的个数。因为只有2和5相乘才能得到10,所以2的个数一定比5多,所以只需要求n!中因子5的个数即可。具体的方法是:
1. 首先计算n!能被5整除的次数,即n!中因子5的个数,记为count。
2. 接着计算n!能被25整除的次数,即n!中因子5^2的个数,记为count2。
3. 依次类推,计算n!能被5^k整除的次数,即n!中因子5^k的个数,记为countk。
4. 直到5^k > n时,停止计算。
5. n!末尾的0的个数即为count + count2 + ... + countk。
下面是Python代码实现:
```python
def count_zeros(n):
count = 0
k = 5
while k <= n:
count += n // k
k *= 5
return count
```
例如,要求10!末尾的0的个数,可以调用count_zeros(10),得到结果为2。
相关问题
n的阶乘定义为n!=1*2*3*……*n 如3!=6 n!通常最后会有很多0,如5!=120 最后有一个0,现在统计n!去除末尾的0后,最后k位是多少
题目中的$b_n$的定义是$n$的阶乘,即$b_n=1*2*3*\cdots*n$。已知$b_3!=6$,$b_5!=120$,而$n!$的末尾会有很多个0,现在我们统计$n!$去除末尾的0之后最后有多少个0。注意到10是由$2*5$得到的,因此我们只需要统计$n!$中2和5的个数,然后取两者的最小值,即为$n!$末尾0的个数。显然2的个数远大于5的个数,因此我们只需要计算$n!$中5的因子个数。依次分别除以5,25,125……,并对每次得到的商进行累加即可。具体来讲,设$f(n)$表示$n!$中5的因子数,则有:
$$f(n)=\left\lfloor \frac{n}{5}\right\rfloor +\left\lfloor\frac{n}{25}\right\rfloor+\left\lfloor\frac{n}{125}\right\rfloor+\cdots$$
现在我们来看一下最后一个问题,即求$n!$除以末尾的0之后最后有多少个非0数字。很明显,这就是要求$n!$除以10之后最后一位非0数的个数,而这个数可以看成是$n!$中质因数2和5的个数之间的最小值。根据之前的计算,$n!$中5的因子数即为$n!$末尾0的个数,那么质因数2的个数又可以通过类似的方法来计算,即
$$g(n)=\left\lfloor \frac{n}{2}\right\rfloor +\left\lfloor\frac{n}{4}\right\rfloor+\left\lfloor\frac{n}{8}\right\rfloor+\cdots$$
综上所述,我们只需要求出$f(n)$和$g(n)$,然后取两者的最小值即可。同时,注意到$f(n)$和$g(n)$都可以用对数的形式表示,具体来讲,有:
$$f(n)=\sum_{i=1}^{\infty}\left\lfloor\frac{n}{5^i}\right\rfloor,\quad g(n)=\sum_{i=1}^{\infty}\left\lfloor\frac{n}{2^i}\right\rfloor$$
for d in read_data: tmp = d.split('\n')[0] tmp = tmp.split(" ") for t in tmp: if t != '': data.append(t) if len(data) > 11: data_len = len(data) last_data = data[10] for i in range(11, data_len): last_data = last_data + ' ' + data[i] data[i] = '' data[10] = last_data if len(data) > 11: for d in data: if d != '': last_datas.append(d) if len(read_data) <= 2: status = '' if k == '服务器': status = '运行中' else: status = '停止' course_list_status.append({ 'name': k, 'status': status }) else: course_list_status.append({ 'name': k, 'status': '运行中' })
这段代码的功能是读取一个文本文件,并将其内容处理成一个列表。具体来说,它会:
1. 遍历文件中的每一行;
2. 去除每行末尾的换行符`\n`;
3. 将每行按照空格分割成一个列表`tmp`;
4. 遍历`tmp`列表中的每个元素,将非空元素添加到`data`列表中;
5. 如果`data`列表中的元素数量大于11,则将第11个元素及之后的元素合并为一个字符串,并将其赋值给第11个元素;
6. 如果`data`列表中的元素数量仍然大于11,则将第11个元素及之后的元素添加到`last_datas`列表中;
7. 如果文件中的行数不超过2,则根据当前行中的关键字`k`设置`status`变量的值,并将`name`和`status`添加到`course_list_status`列表中;
8. 如果文件中的行数超过2,则将`name`和`status`添加到`course_list_status`列表中,其中`status`默认为"运行中"。
阅读全文