Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2023, 11:45   #1
Quuas
 
Регистрация: 21.05.2023
Сообщений: 4
По умолчанию Помогите решить задачу на C++

Напишите программу, которая составляет из цифр введённой строки число-палиндром максимальной длины (которое читается одинаково слева направо и справа налево). Если таких чисел несколько, нужно вывести минимальное из них. Все имеющиеся цифры использовать не обязательно, но количество цифр в ответе должно быть максимально возможным.

Входные данные
Входная строка содержит цифры (по крайней мере, одну) и, возможно, другие символы.

Выходные данные
Программа должна вывести число-палиндром максимальной длины, которое можно составить из цифр входной строки.

Примеры
входные данные
for i:=99921 downto 2
выходные данные
29192

Мой код:
Код:
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;
int main() {
    string input;
    getline(cin, input);

    string digitsOnly = "";
    for (int i = 0; i < input.size(); i++) {
        if (input[i] >= '0' && input[i] <= '9') {
            digitsOnly += input[i];
        }
    }

    sort(digitsOnly.begin(), digitsOnly.end(), greater<char>());
    cout << digitsOnly;
    return 0;
}
После того как в отдельную строку записал все цифры из входной строки не могу понять как из них сделать число-палиндром.

Последний раз редактировалось BDA; 21.05.2023 в 19:24.
Quuas вне форума Ответить с цитированием
Старый 21.05.2023, 18:08   #2
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 954
По умолчанию

думаю палиндромы лучше создавать из центра

поместив в центр символы количества нечётного
и расставляя по бокам символы количества чётного

сначала наверняка разделив количества чётные и нечётные
и сортируя по количеству чтоб в центре были наибольшие

тогда небось нужно 2 варианта развития
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую

Последний раз редактировалось сфинкс; 21.05.2023 в 18:10.
сфинкс вне форума Ответить с цитированием
Старый 21.05.2023, 19:54   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Вроде работает. Сначала печатается половина (округленная до четного) от количества каждой цифры по возрастанию цифр (а ноль после первой ненулевой цифры). Потом печатается цифра в середине палиндрома, если есть нечетное количество какой-либо цифры (минимальной). Затем печатается снова половина, но по убыванию цифр (а ноль перед той же цифрой, что в первом цикле). Если имеются только нули в четном количестве, то печатается один ноль.
Код:
#include <iostream>
#include <string>

using namespace std;

int main() {
    string input;
    getline(cin, input);

    int digitsCount[10] = {0};
    for (int i = 0; i < input.size(); i++)
        if (input[i] >= '0' && input[i] <= '9')
            digitsCount[input[i] - '0']++;

    int zeroesBefore = -1, maxDigit = -1;
    for (int i = 1; i < 10; i++)
    {
        int k = digitsCount[i] / 2;
        for (int j = 0; j < k; j++)
            cout << i;
        if (digitsCount[i])
            maxDigit = i;
        if (zeroesBefore == -1 && k)
        {
            zeroesBefore = i;
            int k = digitsCount[0] / 2;
            for (int j = 0; j < k; j++)
                cout << 0;
        }
    }
    for (int i = 0; i < 10; i++)
        if (digitsCount[i] % 2)
        {
            cout << i;
            break;
        }
    for (int i = 9; i > 0; i--)
    {
        if (zeroesBefore == i)
        {
            int k = digitsCount[0] / 2;
            for (int j = 0; j < k; j++)
                cout << 0;
        }
        int k = digitsCount[i] / 2;
        for (int j = 0; j < k; j++)
            cout << i;
    }
    if (maxDigit == -1 && digitsCount[0] && digitsCount[0] % 2 == 0)
        cout << 0;
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 21.05.2023 в 20:20.
BDA вне форума Ответить с цитированием
Старый 21.05.2023, 22:39   #4
Quuas
 
Регистрация: 21.05.2023
Сообщений: 4
По умолчанию

BDA, Спасибо большое. Подскажите, чтобы так писать это только опыт или можете посоветовать литературу для развития логики?
Quuas вне форума Ответить с цитированием
Старый 22.05.2023, 08:22   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Пожалуйста. Литературу по логике не могу посоветовать - не читал. Думаю, можно и изящнее как-нибудь решить. Опыт важен - решайте больше задачек, придумывайте сложные тесты (на граничные условия, большие по объему) и проверяйте свое решение на корректность и скорость работы.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите решить задачу на с#,уже час ломаю голову,не могу решить. KeyJW Помощь студентам 1 09.11.2022 22:15
Помогите решить задачу,пожалуйста!!!вторую часть не могу решить. Родион Афанасьев Паскаль, Turbo Pascal, PascalABC.NET 1 03.03.2018 19:44
Помогите решить задачу на с++ Nafan142rus Помощь студентам 1 11.06.2017 21:33