lintcode第二题尾部的0

这篇博客讨论了如何设计一个O(log N)时间复杂度的算法,来计算n阶乘结果中尾部零的数量。作者首先介绍了直观的O(n)解决方案,然后逐步优化到使用除法策略来快速计算5的因子个数,从而达到更高的效率。
摘要由CSDN通过智能技术生成

描述

设计一个算法,计算出n阶乘中尾部零的个数

样例

11! = 39916800,因此应该返回 2

挑战

O(logN)的时间复杂度


——————————问题分割线——————————

看到题,第一思路是考虑提取因子5,有几个5就有几个0,只是这似乎是O(n)的复杂度。

还是先实现题目吧

利用for循环对5的倍数进行历遍,再通过countOf5的函数统计5因子的个数,countOf5可以通过自身的递归调用实现5因子的个数的统计。


	int countOf5(long i) {
		int counttemp = 0;
		while (i%5 == 0)
		{
			counttemp = counttemp + 1;
			countOf5(i / 5);
		}
		return counttemp;
	}

	long long trailingZeros(long long n) {
		// write your code here, try to do it without arithmetic operators.
		int count = 0;
		for (size_t i = 5; i < n; i = i + 5)
		{
			count = count + countOf5(i);
		}
		return (long)count;
	}
测试是通过了,但是却返回了
提示
你的代码运行时间超过了限制,检查你的时间复杂度。TLE通常是由死循环造成的,思考一下你的时间复杂度是否是最优的。

捂脸

原来O(log n)是必须的啊

既然要log n,那必须要用更优的方法来求5的个数

想了想,才明白要这样

long count = n/5,这样就能得到5的整倍数的个数,然后再/5就能得到25整倍数的个数,以此类推,代码就变成了

	long long trailingZeros(long long n) {
		// write your code here, try to do it without arithmetic operators.
		long count = 0;
		long counttemp = n / 5;
		while (counttemp != 0)
		{
			count = count + counttemp;
			counttemp = counttemp / 5;
		}

		return (long)count;
	}
确实在效率上优化了很多,学到了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值