Задача на количество простых делителей. C++
Условие задачи:
Знаете ли вы, что такое простое число? Простое число – это натуральное число, имеющее ровно два различных натуральных делителя: единицу и самого себя. Все остальные числа, кроме единицы, называются составными. Например, числа 2, 3, 5, 7, 11 являются простыми. А числа 4, 6, 10 – составными.
Требуется из заданного набора чисел выбрать одно, имеющее максимальное количество простых делителей. Например, 30 имеет три простых делителя (2, 3 и 5), а 40 – только два (2 и 5).
Входные данные: Первая строка входного файла INPUT.TXT содержит число N – количество чисел в наборе. Во второй строке теста содержится N чисел, разделенных пробелом. Все числа во входных данных целые, принимающие значения от 2 до 1024.
Выходные данные: В выходной файл OUTPUT.TXT выведите число с максимальным количеством простых делителей. Если таких чисел несколько, выведите наименьшее из них.
Мое решение:
#include <bits/stdc++.h>
using namespace std;
int cnt_divisors(int n) //по сути задача на факторизацию.
{
set<int> s; //s - множество для нахождения РАЗЛИЧНЫХ простых делителей (что и требуется по условию задачи)
for (size_t i = 2; i*i <= n; i++) //факторизуем.
{
while (n % i == 0)
{
s.insert(i);
n /= i;
}
}
if (n != 1)
s.insert(n); //случай простого числа
return s.size();
}
int main()
{
int n;
cin >> n;
int mxcnt; //число которое мы ищем
cin >> mxcnt;
for (size_t i = 0; i < n - 1; i++) //n - 1 цикл, потому что мы уже сделали ввод в переменную mxcnt
{
int x;
cin >> x;
if (cnt_divisors(x) > cnt_divisors(mxcnt))
mxcnt = x;
}
cout << mxcnt;
}
Мое решение проваливается на одном из тестов. На самом деле я реализовывал 3 различных решения и все они проваливаются на одном и том же тесте (что заставляет меня задуматься записывать числа с входа в массив, потому что не исключено, что я мог налажать в реализации "безмассивного" алгоритма). Я не вижу какого-то частного случая? В чем может быть проблема?
Ответы (1 шт):
Чтобы выбирать наименьшее:
cin >> x;
if (cnt_divisors(x) > cnt_divisors(mxcnt))
mxcnt = x;
else if (cnt_divisors(x) == cnt_divisors(mxcnt) && mxcnt > x)
mxcnt = x;