您的位置:首页 > 游戏 > 手游 > 趣味算法------尾部零的个数(C语言,python双重解法)

趣味算法------尾部零的个数(C语言,python双重解法)

2024/12/26 9:19:43 来源:https://blog.csdn.net/markingyi/article/details/141498679  浏览:    关键词:趣味算法------尾部零的个数(C语言,python双重解法)

 

目录

题目描述:

解题思路:

具体代码:

注意:


题目描述:


给出数字 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循环里的数字,而不是通过自增改变值。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com