目录
题目描述:
解题思路:
具体代码:
注意:
题目描述:
给出数字 n(0<n<1000000),计算出 n 阶乘尾部零的个数。
输入输出格式
输入格式
一个整数。
输出格式
一个整数。
输入输出样例
输入
11
输出
2
说明/提示
11! = 39916800,结尾的 0 有 2 个。
解题思路:
我们以输入11为例,11的阶乘为 1*2*3*4*5*6*7*8*9*10*11,其中 2*5 可以得出10,阶乘中又包含10,两个10相乘得出尾部两个0,如果输入25,得出25的阶乘为1*2*3*4......*23*24*25。其中4可以拆成 2*2,25可以拆成5*5,由于尾部0可以由偶数和5的倍数相乘得到。在阶乘过程中通过拆分2的个数一定比5的个数多,所以我们只需要统计阶乘中的每一个数字可以拆分成几个5,然后求和得到结果。
具体代码:
#include<stdio.h>
int main(void)
{int n;int count = 0;scanf("%d", &n);for (int i = 1; i <= n; i++){int k = i;//复制阶乘中的每一个数字。while (k)//当这个数字不为0时。{if (k % 5 == 0)//如果这个数字可以拆分出5{count++;k /= 5;}elsebreak;}}printf("%d", count);//输出结果。
}
注意:
很多新手小白或者先学习python后刚刚接触C语言的同学可能会犯一个错误,就是没有用k复制 i ,认为这是多此一举,如果真是这样,代码就是这个样子。
#include<stdio.h>
int main(void)
{int n;int count = 0;scanf("%d", &n);for (int i = 1; i <= n; i++){while (i)//当这个数字不为0时。{if (i % 5 == 0)//如果这个数字可以拆分出5{count++;i /= 5;}elsebreak;}}printf("%d", count);//输出结果。
}
假设 i = 5,先通过while循环每一步过程使得 i 变成 1,然后通过for循环一轮一轮自增又变成5,通过while循环每一步过程使得 i 变成 1,然后通过for循环一轮一轮自增又变成5......然后发现陷入了死循环,
而python不会陷入这个循环就是因为python写法是
n = int(input())
count = 0
for i in range(2,n+1):while i:if i%5 == 0:count += 1i //= 5else:break
print(count)
i 的取值是for循环一步一步复制range循环里的数字,而不是通过自增改变值。