leecode 解题总结:172. Factorial Trailing Zeroes

#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>
using namespace std;
/*
问题:
Given an integer n, return the number of trailing zeroes in n!.

Note: Your solution should be in logarithmic time complexity.

分析:计算n!中尾部的0,时间复杂度必须是O(logN)
尾部的0的计算因为阶乘中构成:肯定是因为2*5,
阶乘就是=2^k * 5^p = 10^( min(k,p) ),所以0的个数=min(k,p)
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
又发现,5的个数总是少于2的个数,所以0的个数=5的个数决定
5的个数n/5,20/5=4,15/5=3,25/5=5
25/5=5,125/5
但是25发现5^2,有两个5需要弄清楚,需要计算
n!=5^k * x,求出k即可,
5^2,5^3,125/5=25,
只需要求出5^k <= n,中的k,然后
用n/25=p,用p+(k-1)*k/2即可
那么问题的关键就是变成如何计算出: 5^k <= n,可以用二分法,5^1
如果每次乘以5,太慢了,最好5^1,5^2,5^4,这种翻倍
举例:9求3^k,那么3 < 9,变成2*3=6,发现,6<9,
发现6*2 = 12 > 9,所以取,所以找到了,
5^1,5^2,5^4,如果找到5^k=n,直接输出k,如果
发现5^k > n ,5^(k/2),然后尝试k/2到k中进行二分法
125/5=25,25/5=5,不断累除5即可,
20/5=
50/5=10,
50=5^2+1
输入:
5
20
25
125
50
200
输出:
1
4
6
31
12
49
没有考虑到50和25一样也是5^2,中
25=5^2*1
50=5^2*2
75=5^2*3
100=5^2*4
125=5^3
250=5^3*2 假设为v
1+1+1+1+4+4+4+4+124+
设计算出的最大指数为k,其他系数为v。
(k-1)*v + (k-2)*4 + ..+ 1*4
假设k=3,余数v=1
2 + 4  = 6,125 / 5 = 25
直接每次获取5,10,...5n这种来做,但是时间复杂度为O(n)
200=5^2*2*2*2

关键:
leecode解法:https://leetcode.com/problems/factorial-trailing-zeroes/?tab=Solutions
不断让让n除以i的数量,i乘以5得到新的i,重复上述操作。这样就能
将n^2,n^3这种带来的额外的5的次数累加进去
*/

class Solution {
public:
    int trailingZeroes(int n) {
		int result = 0;
		for(long long i = 5 ; n / i > 0 ; i *= 5)
		{
			result += (n/i);
		}
		return result;
    }
};

void print(vector<int>& result)
{
	if(result.empty())
	{
		cout << "no result" << endl;
		return;
	}
	int size = result.size();
	for(int i = 0 ; i < size ; i++)
	{
		cout << result.at(i) << " " ;
	}
	cout << endl;
}

void process()
{
	 vector<int> nums;
	 int value;
	 int num;
	 Solution solution;
	 vector<int> result;
	 while(cin >> num )
	 {
		 int temp = solution.trailingZeroes(num);
		 cout << temp << endl;
	 }
}

int main(int argc , char* argv[])
{
	process();
	getchar();
	return 0;
}


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值