Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+2

Разложение на чётнопростые

В этой задаче рассматриваются только чётные целые числа.

Чётное натуральное число 𝑛 будем называть чётнопростым числом, если его нельзя представить в виде произведения двух чётных чисел. Например, числа 2 и 6 — чётнопростые.

Очевидно, что каждое число либо является чётнопростым, либо разлагается в произведение чётнопростых. Но такое разложение на чётнопростые не всегда единственно.

Входные данные

Дано чётное натуральное 𝑛≤109.

Выходные данные

Если число 𝑛 чётнопростое, выведите слово prime. Если это число единственным образом разлагается в произведение двух и более чётнопростых, то выведите слово single, а в следующей строке выведите разложение этого числа на чётнопростые множители. Если число допускает несколько различных разложений на чётнопростые, то выведите слово many, а в следующих двух строках выведите два каких-нибудь различных разложения числа на чётнопростые множители.

Примеры

Ввод
Вывод
6
prime
4
single
2 2

Вот мой код:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
 #include <iostream> 
#include <cmath> 
using namespace std; 
 
int is_prime(int n) //функция проверки на простоту числа
{ 
    int k = 0; 
    for (int i = 2; i <= sqrt(n); ++i) 
    { 
        if (n % i == 0) 
        { 
            return false; 
        } 
    } 
    return !k; 
} 
 
int main() 
{ 
    int n, k, del1, del2; //n - число с клавиатуры, k - количество 2 в разложении числа
    cin >> n; 
     
    while (n % 2 == 0) 
    { 
        k += 1; 
        n /= 2; 
    } 
    if (k <= 1) cout << "prime"; //если одна 2 в разложении, то prime
    else if (n * 4 == 4 && k == 2) //если введённое число - 4(просто чтобы потом с выводом не париться)
    { 
        cout << "single" << endl << 2 << " " << 2; 
    } 
    else if (is_prime(n)) // если оставшееся после убирания двоек число простое, то существует только один вариант разложения на чётнопростые
    { 
        cout << "single" << endl << n * 2 << " "; 
        for (int i = 1; i < k; ++i) 
        { 
            cout << 2 << " "; 
        } 
    } 
    else //в другом случае:
    { 
        for (int d = 3; d * d <= n; d += 2) 
        { 
            if (n % d == 0) 
            { 
                del2 = n / d; // берём первые попавшиеся 2 числителя, чтобы потом вывести 2 возможных разложения
                del1 = d; 
                break; 
            } 
        } 
        cout << "many" << endl << del1 * 2 << " " << del2 * 2 << " "; 
        for (int i = 2; i < k; ++i) 
        { 
            cout << 2 << " "; 
        } 
        cout << endl; 
        cout << n * 2 << " "; 
        for (int i = 1; i < k; ++i) 
        { 
            cout << 2 << " "; 
        } 
    } 
    return 0; 
} 

На первом же тесте вылезает такая ошибка, хотя, когда я тестил её в компиляторе, её не было. Помогите, пожалуйста, починить код!!

По дате
По рейтингу
Аватар пользователя
Искусственный Интеллект
11мес

Чувак, число, которое можно представить в виде произведения двух четных чисел, без остатка делится на 4. Если такой способ не единственный, оно делится на 8. Начни с этого, и твой код станет гораздо проще, а места для ошибок - гораздо меньше.