求表达式 f(n)结果末尾0的个数
1.思路
- 要求是求解末尾0的个数,如果要产生0,则需要产生因子10,所以相当于需要计算出10的数量。
- 但是10不是最小的因子,他还可以分解成2 * 5, 所以需要找出2和5的个数,最后取两者中最小的,即为0的个数。
2.代码
①过多重复计算,效率低,不通过
#include<iostream>
using namespace std;
//计算阶乘i中包含因子n的个数 --某些数字重复计算
int CalNumber(int num,int n)
{
int count = 0;
for (int i = 1; i <= num; ++i)
{
int temp = i;
while (temp >= n && temp % n == 0)
{
temp /= n;
count++;
}
}
return count;
}
int main()
{
int n = 0;
cin >> n;
int num2 = 0;
int num5 = 0;
for (int i = 1; i <= n; ++i)
{
num2 += CalNumber(i, 2);
num5 += CalNumber(i, 5);
}
cout << min(num2, num5) << endl;
return 0;
}
②找到规律(有许多数字重复出现),修改 ,通过
#include<iostream>
using namespace std;
int CalNumber(int num, int n)
{
int count = 0;
while (num >= n && num % n == 0)
{
num /= n;
count++;
}
return count;
}
int main()
{
int n = 0;
cin >> n;
int num2 = 0;
int num5 = 0;
for (int i = 1; i <= n; ++i)
{
num2 += CalNumber(i, 2) * (n + 1 - i); //过滤掉重复的计算
num5 += CalNumber(i, 5) * (n + 1 - i);
}
cout << min(num2, num5) << endl;
return 0;
}