leetcode——172 Factorial Trailing Zeroes(N!尾巴上有多少个0,算法复杂度为lg)

Given an integer n, return the number of trailing zeroes in n!.

Note: Your solution should be in logarithmic time complexity.(您的解决方案应该在对数时间复杂度。)

Hide Tags: Math


题目要求:给定N,求N!的末尾有多少0。要求算法复杂度为lg

解题思路:

思路一:

想的比较简单,先实用for循环进行阶乘运算,然后mod10计算0的个数,但是在OJ检查时,超时!,显然是没满足算法时间复杂度为lg的要求。(失败)

代码如下:

	public static int trailingZeroes1(int n)
	{
		int sum=1;
		int count=0;
		for (int i = n; i >0; i--)
		{
			sum*=i;
		}
		while (sum!=0)
		{
			int remain=sum%10;
			if (remain==0)
			{
				count++;
			}
			else if (remain!=0)
			{
				break;
			}
			sum/=10;
			
		}
		return count;
	}

思路二(推荐):

只有在2*5的时候才会出现0,其中整十的数也可以看成是2*5的结果,因此,只要在n之间看有多个2,多少个5即可,不难发现2的个数大于5的个数。


因此只需要要记录5的个数即可。但是需要注意的是:像25,125,625之类的数,除以5以后的结果还是5的倍数,所以还需要继续循环处理。


(OJ测试成功)

代码如下:

	public static int trailingZeroes(int n)
	{
		int result=0;
		while (n!=0)
		{
			result=result+n/5;
			n/=5;
		}
		return result;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值