求N的阶乘N!中末尾0的个数
求N的阶乘N!中末尾0的个数
有道问题是这样的:给定一个正整数N,那么N的阶乘N!末尾中有多少个0呢?例如:N=10,N=3628800,则N!的末尾有两个0;直接上干货,算法思想如下:对于任意一个正整数N!,都可以化为N!= (2^X)*(3^Y)* (5^Z)......的形式,要求得末尾0的个数只需求得min(X, Z)即可,由于是求N!,则X >= Z; 即公约数5出现的频率小于等于2出现的频率,即Z=min(X, Z),即出现0的个数等于公约数5出现的次数;
方法一:
1 #include <stdio.h> 2 int main() 3 { 4 int N; 5 int sum = 0; 6 scanf("%d", &N); // 输入N 7 for(int i = 1; i <= N; i++) 8 { 9 int j = i; 10 while(0 == j % 5) 11 { 12 sum++; // 统计公约数5出现的频次 13 j /= 5; 14 } 15 } 16 17 printf("%d\n", sum); 18 19 return 0; 20 }
方法二:
1 #include <stdio.h> 2 int main() 3 { 4 int N; 5 int sum = 0; 6 scanf("%d", &N); 7 while(N) 8 { 9 sum += N / 5; 10 N /= 5; 11 } 12 printf("%d\n", sum); 13 14 return 0; 15 }