在 C++ 中找出可整除某个阶乘的最大数
假设我们有两个数 n 和 fact。我们必须找出 n 的最大幂,该幂可以整除 fact! (fact 的阶乘)。所以,如果 fact = 5,且 n = 2,那么输出将是 3。所以 5! = 120,这可以被 2^3 = 8 整除。
这里我们将使用勒让德公式。该公式可找出素数的最大幂,该幂可以整除 fact!。我们将找出 n 的所有素数因子,然后找出其可以整除 fact! 的最大幂。
所以,如果 fact 是 146,且 n = 15,那么 n 的素数因子是 5 和 3。所以
对于 3,将是 [146/3] + [48/3] + [16/3] + [5/3] + [1/3] = 48 + 16 + 5 + 1 + 0 = 70。
对于 5,将是 [146/5] + [29/5] + [5/5] + [1/3] = 29 + 5 + 1 + 0 = 35。
示例
#include<iostream> #include<cmath> using namespace std; int getPowerPrime(int fact, int p) { int res = 0; while (fact > 0) { res += fact / p; fact /= p; } return res; } int findMinPower(int fact, int n) { int res = INT_MAX; for (int i = 2; i <= sqrt(n); i++) { int cnt = 0; if (n % i == 0) { cnt++; n = n / i; } if (cnt > 0) { int curr = getPowerPrime(fact, i) / cnt; res = min(res, curr); } } if (n >= 2) { int curr = getPowerPrime(fact, n); res = min(res, curr); } return res; } int main() { int fact = 146, n = 5; cout << "Minimum power: " << findMinPower(fact, n); }
输出
Minimum power: 35
广告