版权声明:本文采用 知识共享署名4.0 国际许可协议进行许可。 https://blog.csdn.net/youmian6868/article/details/88393163
题目
给定一个非负整数N,返回N!结果的末尾为0的数量。
进阶题目
给定一个非负数N,如果用二进制数表达N!的结果,返回最低位的1在哪个位置上,认为最右的位置为位置0。
代码实现
public class ZeroNum {
//找出1~N所有的数中,一共含有多少个因子5,即为N!结果的末尾有多少个0
//对每一个数i来说,处理的代价是logi(以5为底),一共有O(N)个数。
//时间复杂度为O(NlogN)
public int zeroNum1 (int num) {
if (num < 0) {
return 0;
}
int res = 0;
int cur = 0;
for (int i = 5; i < num + 1; i += 5) {
cur = i;
while (cur % 5 == 0) {
res++;
cur /= 5;
}
}
return res;
}
//1~N中有N/5个数,这每一个数都能贡献一个5;然后1~N中有N/(5^2)个数,这每个数又都能贡献一个5···
//时间复杂度为O(logN),以5为底
public int zeroNum2 (int num) {
if (num < 0) {
return 0;
}
int res = 0;
while (num != 0) {
res += num/5;
num /= 5;
}
return res;
}
//进阶题解:最低位的1在哪个位置上,完全取决于1~N的数中因子2有多少个。具体原理与zeroNum2类似,
public int rightOne1 (int num) {
if (num < 1) {
return -1;
}
int res = 0;
while (num != 0) {
num >>>= 1;
res += num;
}
return res;
}
}