想要得到10;就必须是因子2×因子5才可以(为一对)。 因此:题目转化为1-n所有数字中有多少对(2和5) 含有因子2的个数: 每隔2个数字,因子为1个2:2 4 6 8 10 每隔2 * 2个数字,因子为2个2:4 8 12 16 每隔2 * 2 * 2个数字,因子为3个2:8 16 24 每隔2 * 2 * 2 * 2个数字,因子为3个2:16 32 因此因子2个数分别为: 2:1 4:2 6:1 8:3 10:1 12:2 14:1 16: 4 5个因子个数同理。。。 因此:2的因子数一定大于5的因子数,只要判断1-n所有数字有多少因子5即可。
class Solution {
public:
int trailingZeroes(int n) {
int ans = 0;
for (int i = 1; i <= n; ++i) {
int tmp = i;
while (tmp % 5 == 0) {
ans++;
tmp /= 5;
}
}
return ans;
}
};
更优的写法:每个循环依次计算: 1-n中 5的倍数的个数。 1-n中 25的倍数的个数。 1-n中 125的倍数的个数等等。
class Solution {
public:
int trailingZeroes(int n) {
int ans = 0;
while (n / 5) {
ans += n / 5;
n /= 5;
}
return ans;
}
};
|