力扣题库之阶乘后的零

给定一个整数 n,返回 n! 结果尾数中零的数量。

var trailingZeroes = function(n) {
				//求阶乘
				var res = 1
				for( var i = 2 ; i <= n ; i ++){
					// if( i % 2 === 0 || i % 5 === 0){
						res *= i						
					// }										
				}
				//将阶乘的值转化为字符串,方便遍历
				var str = res.toString()				
				//记录0的个数
				var count = 0;
				// console.log(str)  //2.6525285981219103e+32				
					for(var i = str.length - 1 ;i > 0 ; i--){
						if(str[i] != 0) break;
						count ++
					}												
				return count
			};
  • 不会以为这种代码就可以了吧???不会吧?
  • 当输入的数字过大时,例如30 , 30的阶乘是一个非常庞大的数字,计算机会使用科学计数法来表示,那么这种方法会因为科学计数法导致结果错误
  • 下面的代码是根据数学关系鞋的,步骤相当简单,就是理解有点费劲

举例说明,题目:22! 中尾数0的个数。
22! 中,5的倍数的有Math.floor(22/5)=4个,分别是5 10 15 20。
根据前面的分析,题目等价于:5 * 10 * 15 * 20 中尾数0的个数
所以,题目等价于:5^k*k!中尾数0的个数
等价于:k + (k! 中尾数0的个数)

var trailingZeroes = function(n) {
				var count = 0;
				//根据数学关系发现 要想尾数是0 那么 2*5 = 10 ,即找5的倍数,和他的除以5之后继续除以5循环求得0的个数
				while( n >= 5){					
					count += parseInt( n / 5)
					//改变n的值					
					n /= 5					
				}
				return count			
			};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值