C++ 算法:寻找出现次数最多的质因子
思路:
-
预处理出每个数字的质因子集合。
-
统计每种质因子出现次数,取出现次数最多的质因子。
-
如果有多个质因子出现次数相同,输出最小的那个。
关键点:
- 如何预处理质因子集合?
可以先预处理出每个数的最小质因子,然后用类似于埃氏筛法的方式,逐个去掉这些质因子,得到整个质因子集合。
- 如何统计质因子出现次数?
可以用一个 'unordered_map<int, int>',记录每种质因子出现的次数。
- 如何取出现次数最多的质因子?
可以用一个变量 'maxCnt' 记录出现次数最多的质因子出现次数,然后遍历 'unordered_map',取出出现次数等于 'maxCnt' 的质因子中最小的那个。
代码:
// 以下代码示例仅供参考,具体实现可能需要根据实际情况进行调整
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
int n;
cin >> n;
int nums[n];
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
unordered_map<int, int> factorCount;
for (int i = 0; i < n; i++) {
int num = nums[i];
// 预处理质因子集合
for (int j = 2; j * j <= num; j++) {
while (num % j == 0) {
factorCount[j]++;
num /= j;
}
}
if (num > 1) {
factorCount[num]++;
}
}
// 寻找出现次数最多的质因子
int maxCnt = 0;
int maxFactor = -1;
for (auto it = factorCount.begin(); it != factorCount.end(); it++) {
if (it->second > maxCnt) {
maxCnt = it->second;
maxFactor = it->first;
} else if (it->second == maxCnt && it->first < maxFactor) {
maxFactor = it->first;
}
}
cout << maxFactor << endl;
return 0;
}
原文地址: https://www.cveoy.top/t/topic/oxPR 著作权归作者所有。请勿转载和采集!