0

Есть задача, не могу придумать решение, даже мысли нет, точнее как, мысли есть, сделать решето эратосфена, все числа вносить в массив, но как тогда мне нужно это все правильно перемножить? На сколько понимаю это будет 2 3 5, они перемножаются, не подходит, дальше будет 2 3 7, 2 3 11, и так до конца массива, потом будет что то в духе 3 2 5, 3 5 7, 3 5 11, потом 5 2 3, 5 3 7, 5 7 11, и т.д, но сработает ли, а если сработает то как это написать, код не прошу, просто варианты решений на словах, или если моя мысль верна, в чём я сомневаюсь, то так же вариант записи, заранее спасибо

Harry
  • 221,325
  • Пожалуйста, уточните вашу конкретную проблему или приведите более подробную информацию о том, что именно вам нужно. В текущем виде сложно понять, что именно вы спрашиваете. – Дух сообщества Feb 11 '24 at 00:08
  • Имхо, алгоритм тривиален. Пусть число n. Найдите первый простой делитель p1. Если p1== n то ответ Нет. Иначе возьмите m=n/p. Найдите p2 - первый простой делитель m. Если p2==m, то ответ Нет. Иначе возьмите l=m/p2. Проверьте, что l - простое число. Если да, то ответ Да, у n три простых делителя p1, p2 и p3=l. Иначе ответ Нет. – Pak Uula Feb 11 '24 at 02:06
  • Ну вот например у нас число 30, простые числа для произведения его 2 3 5, мы берем первый, 30 != 2, m = 30/2=15, что уже не простое число, p2 будет 2, i = 15/2=7,5,так же – user23328595 Feb 11 '24 at 02:34
  • 1
    Факторизация. Раскладываете на простые и смотрите, сколько их... В каком диапазоне число? – Harry Feb 11 '24 at 05:57
  • На всякий случай стоит уточнить, должны ли простые быть различными, или 12=2*2*3 тоже подойдёт – MBo Feb 11 '24 at 06:29
  • А вот это вопрос хороший, я склонялся больше к тому что они не повторяются, но в условии задачи этот момент вообще не описан, так что сам не знаю – user23328595 Feb 11 '24 at 06:56
  • Возьмём число 30. Первый простой делитель p1=2, следовательно m=15. У m первый простой делитель p2=3, остаётся l=5 - простое число. То есть 30=235 - можно представить в виде произведения трёх простых чисел – Pak Uula Feb 11 '24 at 11:53
  • @Pak Uula Аааа, то есть программа будет крутить до последнего числа, скажем есть число 42, p1 будет 2, останется 21, p2 = 3, 7 он прокрутит числа до 7 и выведет простой делитель 7, будет число 45, прокрутит с 2 до 5, p1 будет 5, останется 9, p2 будет 3, останется три, выбор, либо провернуть это еще раз, либо написать что произведения нет, если есть то 5 3 3, , если будет число 35, то p1 5 , p2 7, трех чисел нет, значит нужно будет доп условие описывающее этот момент, если будет 44, p1 2 p2 2 , а 11 не делится, значит произведения нет,спасибо за помощь – user23328595 Feb 11 '24 at 23:11

1 Answers1

1

Для небольших диапазонов (например, в пределах int) можно просто перебором, даже не строя таблицу простых. Просто факторизацией — разложение на простые и подсчет количества прямо по ходу разложения. Что-то вроде

bool isTriple(unsigned int N)
{
    int cnt = 0;
    while (N%2 == 0) { N/=2; cnt++;}
    if (cnt > 3) return false;
    for(int i = 3; i < sqrt(N) + 1; i+=2)
    {
        if (N%i == 0) while(N%i == 0) { N/=i; cnt++;}
        if (cnt > 3) return false;
    }
    if (N > 1) cnt++;
    return cnt == 3;
}
Harry
  • 221,325
  • sqrt(N) в заголовке цикла? – Stanislav Volodarskiy Feb 11 '24 at 08:08
  • @StanislavVolodarskiy Знаете, если б я написал i*i<=N, ругались бы точно так же :) – Harry Feb 11 '24 at 09:23
  • @Harry Ошибка LNK2019 ссылка на неразрешенный внешний символ main в функции "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ). Project2 C:\Users\Влад\Desktop\c++\Project2\Project2\MSVCRTD.lib(exe_main.obj) 1
    не компилится, хотел в отладчике пошагово разобрать(
    – user23328595 Feb 11 '24 at 23:03
  • Кстати, можете подсказать о чем задумываться чтобы решать задачи которые не имеешь представления решить, к примеру эту задачу я не мог решить и написал вопрос потому что не знал о факторизации, так как ставить вопрос чтобы дойти до нужной мысли, т.к в теории я дочитал только о самом понятии простых чисел и решете, просто нужно было капнуть глубже, или факторизация это смежная тема просто применимая к простым числам? – user23328595 Feb 12 '24 at 01:44
  • Ну, факторизация по сути и есть разложение на простые... Вопрос странный в том смысле, что все знать невозможно, так что, как говаривал один герой О.Генри, "странствуя по свету, я не закрываю глаз" :) Просто кроме глубоких знаний в одной области никогда не мешает общая эрудиция. Что до LNK2019 — с. https://ru.stackoverflow.com/q/536546/195342 — вероятно, неправильно проект создали. Я ваш код не видел, точнее сказать не могу. Может, main с большой буквы написали, как знать? :) – Harry Feb 12 '24 at 05:50
  • А, понял, ваша функция это функция, но не точка входа, исправил, да, понял как работает, если есть то true 1, если нет то false 0, не совсем то что нужно, но я и не просил код, спасибо за прекрасный пример и разъяснения, пойду писать как нужно преподу:) – user23328595 Feb 13 '24 at 00:44
  • Да словами было бы, наверное, длиннее :) – Harry Feb 13 '24 at 06:11
  • @Harry написал я супер программу которая проверяет на квадрат простых чисел и собственно произведение, сделал условия проверки на некорректный ввод по типу отрицательное число, слово, символ, всё бы хорошо, но бьюсь об скалу когда передаю в int дробное число, как я понимаю в воде дробь остается, и второй cin игнорируется, подскажи пожалуйста как решить данную проблему, чтобы либо нельзя было в int писать дробь, либо она округлялась, а второй cin не игнорировался – user23328595 Feb 13 '24 at 15:13
  • https://ru.stackoverflow.com/q/1134202/195342 Но вообще-то это отдельный вопрос, никак не связанный с данным. – Harry Feb 13 '24 at 15:47
  • Да, знаю, но когда я пытался найти решение данной проблемы в интернете, мне выдавало более сложное решение проблемы чем оно могло быть как в вашем примере, и я не хотел вникать в какую то сложную функцию с кучей параметров ради решения простой по идее задачи, а в ссылках яндекса на мой ряд вопросов похожих или ваш вопрос на форуме не выдал, создавать новый вопрос который касается все же этого я посчитал не разумным, так как вы мне ответили и я счёл вас очень отзывчивым, умным и доброжелательным, я решил всё же оставить вопрос как комментарий, но не имел ни малейшего злого умысла злоупотреблять – user23328595 Feb 13 '24 at 18:19
  • Вашей помощью, за что в очередной раз признателен и благодарен что тратите свое время и помогаете мне – user23328595 Feb 13 '24 at 18:22
  • То что он не связан с этим это да, просто я к тому что на мысль меня навели, и код я написал, но вот эта проблема которая встала не с того не с сего она в этой задаче и осталась, и писать новый вопрос описывая эту же задачу, только проблему с вводом помещая в int дробь мне показалось как то не красиво с моей стороны.. – user23328595 Feb 13 '24 at 18:27