Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
0 / 1 / 0
Регистрация: 27.03.2020
Сообщений: 28

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

25.08.2020, 12:07. Показов 3750. Ответов 12
Метки нет (Все метки)

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

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

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

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

Написал код, не проходит 2, 24, 25 тесты. Остальные - проходит.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
 
int main()
{
    vector <int> numbers(10, 0);
    string str;
    getline(cin, str);
    for (int a=0; a<str.size(); a++) if (str[a]>='0' && str[a]<='9') numbers[str[a]-'0']++;
 
    int first=-1;
    for (int a=1; a<10; a++)
    {
        if (numbers[a]>=2)
        {
            first=a;
            numbers[a]-=2;
            break;
        }
    }
 
 
    if (first!=-1)
    {
        cout << first;
        for (int a=0; a<10; a++)
        {
            for (int b=0; b<numbers[a]/2; b++) cout << a;
        }
    }
    for (int a=0; a<10; a++) 
    {
        if (numbers[a]%2==1)
        {
            cout << a;
            break;
        }
    }
    if (first!=-1)
    {
        for (int a=9; a>=0; a--)
        {
            for (int b=0; b<numbers[a]/2; b++) cout << a;
        }
        cout << first;
    }
    return 0;
}
Ссылка на задачу: https://informatics.mccme.ru/m... d=112421#1
P.s мне одному кажется, что новый дизайн информатикса - шляпа?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.08.2020, 12:07
Ответы с готовыми решениями:

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

Найти самое маленькое число, которое можно составить из цифр заданного четырехзначного числа
Задача составаить из четерехзначного числа самое маленькое число, которое можна составить из его цыфр. Подскажите как сделатьиили хотя бы...

Найти палиндром максимальной длины.
Вариант 7(к.р) 1. Описание функции в Турбо Паскале. 2. Понятие перечисляемого и интервального типов данных. 3. Задача. Дана матрица...

12
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
25.08.2020, 14:25
Добавлено через 32 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <algorithm>
using namespace std;
 
int main() {
 string s,t;
 int m[10]={0};
 size_t i=0;
 
 getline(cin,s);
 while(s[i]){
    if(isdigit(s[i]))
         m[s[i]-'0']++;
    i++;
  }
 s="";
 for(int j=9;j>=0;j--)
     if(m[j]>1 ){
        int c=m[j]/2;
        m[j]-=2*c;
        s+=string(c,j+'0');
      }
 t=s;
 reverse(t.begin(),t.end());
 for(int j=9;j>=0;j--)
     if(m[j]==1){
         s+=string(1,j+'0');
         break;
        }
 s+=t;
 t="";
 if(s[0]=='0'){
      i=0;
      while(s[i]=='0')
            t=s[++i];
      s=t;
     }
 cout<<s;
 return 0;
}
0
Злостный нарушитель
 Аватар для Verevkin
10275 / 5699 / 1266
Регистрация: 12.03.2015
Сообщений: 26,393
25.08.2020, 16:34
как-то так, да?

0
0 / 1 / 0
Регистрация: 27.03.2020
Сообщений: 28
25.08.2020, 20:58  [ТС]
Verevkin, типа того, только у вас в 3-ем тесте ошибка. Там же прикол в том, что программа должно вывести максимальное число-палиндром, а у вас число начинается с 0. Так не прокатывает)

Добавлено через 27 секунд
повар1, ? Ваш код не проходит даже тест из примера...
0
Злостный нарушитель
 Аватар для Verevkin
10275 / 5699 / 1266
Регистрация: 12.03.2015
Сообщений: 26,393
25.08.2020, 21:27
Цитата Сообщение от Foksen Посмотреть сообщение
типа того, только у вас в 3-ем тесте ошибка. Там же прикол в том, что программа должно вывести максимальное число-палиндром, а у вас число начинается с 0. Так не прокатывает)
Это можно исправить.
0
0 / 1 / 0
Регистрация: 27.03.2020
Сообщений: 28
25.08.2020, 21:29  [ТС]
Verevkin, я в курсе) Я прикрепил код, в котором этот момент учтён. Но мой код не проходит 3 теста из 25. И вот, я спрашиваю, в чём может быть ошибка
0
Злостный нарушитель
 Аватар для Verevkin
10275 / 5699 / 1266
Регистрация: 12.03.2015
Сообщений: 26,393
25.08.2020, 21:49
Цитата Сообщение от Foksen Посмотреть сообщение
И вот, я спрашиваю, в чём может быть ошибка
хз, я не смотрел. С утра, если не лень будет, доработаю. Исходник на работе остался.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
25.08.2020, 22:17
Foksen, Вот чего наваял
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int m[10] = (0};
getline(cin, str);
for (int a=0; a<str.size(); a++) if (str[a]>='0' && str[a]<='9') m[str[a]-'0']++;
string s = "";
int centr = -1;
for(int j=9; j>=0;) [
  if (m[j]>1) {
    s += '0' + j;
    m[j]-=2;
    continue;
  }
  if (m[j]==1) {
    if (centr<0) centr = j;
  }
   j--;
}
string t = s;
revers(t.begin(), t.end());
s += centr < 0 ? "" : centr + '0' + t;
cout << s;
Если есть ошибки, будьте снисходительны
0
 Аватар для LegionK
393 / 263 / 193
Регистрация: 02.05.2017
Сообщений: 1,003
25.08.2020, 22:36
Лучший ответ Сообщение было отмечено Foksen как решение

Решение

Не знаю как ведет себя код Байт и Verevkin, но собственно вот этот получает OK.
В чем у вас ошибка я не скажу, не смотрел код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main() 
{
    string s;
    getline(cin,s);
    
    vector<int>v(10);
    
    for(int i = 0;i<s.size();++i)if(isdigit(s[i]))++v[s[i]-'0'];
        
    vector<int>ans(s.size()+1,-1);
    
    int num = -1;
    
    int l(0),r(s.size()-1);
    
    if(v[0] > 1){
        
        int t = -1;
        
        for(int i = 1;i<10;++i){
            if(v[i] > 1){
                t = i;
                break;
            }
        }
        if(t == -1){
            cout << 0;
            return 0;
        } else {
            
            ans[l] = t;
            ans[r] = t;
            ++l;
            --r;
            
            v[t] -= 2;
        }
        
        
    }
    
    for(int i = 0;i<10;++i){
        
        if(v[i] % 2 == 0){
            for(int j = 0;j<v[i]/2;++j){
                ans[l] = i;
                ans[r] = i;
                ++l; --r;
            }
        } else {
            
            if(num == -1)num = i;
            --v[i];
            
            for(int j = 0;j<v[i]/2;++j){
                ans[l] = i;
                ans[r] = i;
                ++l; --r;
            }
            
        }
    }
    
    s.clear();
    
    for(int i = 0;i<ans.size();++i)if(ans[i] != -1)s.push_back(ans[i]+'0');
    
    if(num != -1)s.insert(s.size()/2,1,(num+'0'));
    
    cout << s;
    
    
    return 0;
}
Цитата Сообщение от Foksen Посмотреть сообщение
мне одному кажется, что новый дизайн информатикса - шляпа?
Да, раньше удобнее было.
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
25.08.2020, 22:41
Да, с нулем лопухнулся. Работа над ошибками
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
int m[10] = (0};
getline(cin, str);
for (int a=0; a<str.size(); a++) if (str[a]>='0' && str[a]<='9') m[str[a]-'0']++;
string s = "";
int k;
for(k=1; k<10; k++) 
  if (m[k]) break;
if (k==10) { // Ничего кроме нулей
  cout << 0;
  return 0;
}
for(k=9; k>0; k--) {
  if (m[k] > 1) {
    s = '0' + k;
    m[k]-=2;
    break;
  }
}
int centr = -1;
for(int j=9; j>=0;) [
  if (m[j]>1) {
    if (j>0) s += '0' + j;
    m[j]-=2;
    continue;
  }
  if (m[j]==1) {
    if (centr<0) centr = j;
  }
   j--;
}
string t = s;
revers(t.begin(), t.end());
s += centr < 0 ? "" : centr + '0' + t;
cout << s;
return 0;
0
Злостный нарушитель
 Аватар для Verevkin
10275 / 5699 / 1266
Регистрация: 12.03.2015
Сообщений: 26,393
26.08.2020, 08:40
Подправил.



Вроде работает. Гляжу, задачу уже решили, пока я спал...

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/******************************************************************************/
/*                          Verevkin, CodeBlocks c++                          */
/******************************************************************************/
 
// d:\Soft\CodeBlocks\share\CodeBlocks\templates\wizard\console\cpp\main.cpp
//#include <iostream> <-- раскомментить, если надо
 
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
 
// извлечение количеств каждой цифры среди символов строки src
unsigned get_counts(char* src, unsigned* dest)
{
  memset(dest, 0, 10 * sizeof(unsigned));
  unsigned total = 0;
 
  for (; *src; src++)
    if (isdigit(*src))
      dest[*src - 0x30]++, total++;
 
  return total;
}
 
//кол-во чисел, извлечённых из строки
unsigned get_total(unsigned* counts)
{
  unsigned idx = 10, total = 0;
  while (idx--) total += *counts++;
  return total;
}
 
// минимальная цифра из доступных
unsigned peek(unsigned* counts)
{
  for (unsigned digit = 0; digit != 10; digit++)
    if (counts[digit]) return digit;
  return 10; // пусто
}
 
// пока для длины, равной кол-во цифр
char* construct_palindrome(unsigned* counts)
{
  unsigned max_len = get_total(counts); // максимальная длина палиндрома
  char* demo = new char[max_len + 1];
 
  while (max_len)
  {
    bool found = false;
    unsigned temp[10], dig_idx = 0;
    memcpy(temp, counts, sizeof(temp)); // расходная копия (для наглядности)
    memset(demo, 'x', max_len);         // ххххххххххх
    demo[max_len] = 0;
 
    // единственная цифра
    if (max_len == 1)
    {
      demo[0] = 0x30 + peek(temp);
      return demo;
    }
 
    // заполнение палиндрома с обоих концов
    for (unsigned idx = 1; !found && idx != 11; idx++)
    {
      while (!found && temp[idx % 10] > 1)
      {
        demo[dig_idx] = 0x30 + (idx % 10);
        demo[max_len - dig_idx - 1] = demo[dig_idx];
        printf("%s\n", demo);
        temp[idx % 10] -= 2;
 
        // условие выхода - палиндром найден (кроме средней цифры для нечёт. кол-ва):
        found = (++dig_idx == max_len >> 1);
      }
    }
 
    // для чётного количества - сразу на выход:
    if (found && ~max_len & 1) break;
 
    // для нечётного кол-ва - поиск цифры в середину:
    if (found && max_len & 1)
    {
      unsigned center_digit = peek(temp);
      if (center_digit < 10)
      {
        demo[dig_idx] = center_digit + 0x30; // центральная цифра есть
        break; // while
      }
    }
 
    max_len--;// иначе - укорачиваю длину палиндрома и по-новой.
  } // while
 
  return demo; // будет непустым, если на входе хотя бы одна цифра есть
}
 
 
int main(int argc, char** argv)
{
  system("chcp 65001 & cls");
//  int x;
  char key, src[1024];
  unsigned total = 0;
  unsigned counts[10];
 
  do
    {
      printf("\n ?? Введи строку: ");
      gets(src);
      //strcpy(src, "for i:=99921 downto 2");
 
    total = get_counts(src, counts);
    printf(" # Найдено цифр в строке: %u\n", total);
    if (total) printf(" # палиндром: \x22%s\x22.\n", construct_palindrome(counts));
 
      printf("\n >> Ещё разок? [y/n]: ");
      key = getch();
    }
    while (key != 'n' && key != 'N' );
 
  printf("\n >> Жмакни чо-нить для выхода...");
  getch(); // ожидание клавиши
 
  return 0;
}
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8652 / 4487 / 1669
Регистрация: 01.02.2015
Сообщений: 13,897
Записей в блоге: 12
26.08.2020, 09:14
Verevkin,
Цитата Сообщение от Foksen Посмотреть сообщение
Если таких чисел несколько, нужно вывести минимальное из них
т.е. для цифр
22335000
ответ
2030302
0
Злостный нарушитель
 Аватар для Verevkin
10275 / 5699 / 1266
Регистрация: 12.03.2015
Сообщений: 26,393
26.08.2020, 10:02
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
т.е. для цифр
22335000
ответ
2030302
молодец, нашёл ошибку.



Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/******************************************************************************/
/*                          Verevkin, CodeBlocks c++                          */
/******************************************************************************/
 
// d:\Soft\CodeBlocks\share\CodeBlocks\templates\wizard\console\cpp\main.cpp
//#include <iostream> <-- раскомментить, если надо
 
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
 
// извлечение количеств каждой цифры среди символов строки src
unsigned get_counts(char* src, unsigned* dest)
{
  memset(dest, 0, 10 * sizeof(unsigned));
  unsigned total = 0;
 
  for (; *src; src++)
    if (isdigit(*src))
      dest[*src - 0x30]++, total++;
 
  return total;
}
 
//кол-во чисел, извлечённых из строки
unsigned get_total(unsigned* counts)
{
  unsigned idx = 10, total = 0;
  while (idx--) total += *counts++;
  return total;
}
 
// минимальная цифра из доступных
unsigned peek(unsigned* counts)
{
  for (unsigned digit = 0; digit != 10; digit++)
    if (counts[digit]) return digit;
  return 10; // пусто
}
 
// вставка символа с обеих сторон палиндрома
char* add_digit(char* dest, char digit, unsigned position)
{
  dest[position]                    = 0x30 + digit;
  dest[strlen(dest) - position - 1] = 0x30 + digit;
  printf("%s\n", dest);
  return dest;
}
 
// пока для длины, равной кол-во цифр
char* construct_palindrome(unsigned* counts)
{
  unsigned max_len = get_total(counts); // максимальная длина палиндрома
  char* demo = new char[max_len + 1];
 
  while (max_len)
  {
    bool found = false;
    unsigned temp[10], dig_idx = 0;
    memcpy(temp, counts, sizeof(temp)); // расходная копия (для наглядности)
    memset(demo, 'x', max_len);         // xxxxxxxxxxx
    demo[max_len] = 0;
 
    // единственная цифра
    if (max_len == 1)
    {
      demo[0] = 0x30 + peek(temp);
      return demo;
    }
 
    // первая/последняя цифра
    for (unsigned idx = 1; !found && idx != 10; idx++)
      if (temp[idx] > 1)
      {
        add_digit(demo, idx, dig_idx++); // вставка символа с обеих сторон палиндрома
        temp[idx] -= 2;
        break; // первая цифра найдена
      }
 
    // остальные цифры
    for (unsigned idx = 0; !found && idx != 10; idx++)
      while (!found && temp[idx] > 1)
      {
        add_digit(demo, idx, dig_idx); // вставка символа с обеих сторон палиндрома
        temp[idx] -= 2;
 
        // условие выхода - палиндром найден (кроме средней цифры для нечёт. кол-ва):
        found = (++dig_idx == max_len >> 1);
      }
 
    // для чётного количества - сразу на выход:
    if (found && ~max_len & 1) break;
 
    // для нечётного кол-ва - поиск цифры в середину:
    if (found && max_len & 1)
    {
      unsigned center_digit = peek(temp);
      if (center_digit < 10)
      {
        demo[dig_idx] = center_digit + 0x30; // центральная цифра есть
        break; // while
      }
    }
 
    max_len--; // иначе - укорачиваю длину палиндрома и по-новой.
  } // while
 
  return demo; // будет непустым, если на входе хотя бы одна цифра есть
}
 
 
int main(int argc, char** argv)
{
  system("chcp 65001 & cls");
  char key, src[1024];
  unsigned total = 0;
  unsigned counts[10];
 
  do
    {
      printf("\n ?? Введи строку: ");
      gets(src);
      //strcpy(src, "for i:=99921 downto 2");
      //strcpy(src, "22335000");
 
    total = get_counts(src, counts);
    printf(" # Найдено цифр в строке: %u\n", total);
    if (total) printf(" # палиндром: \x22%s\x22.\n", construct_palindrome(counts));
 
      printf("\n >> Ещё разок? [y/n]: ");
      key = getch();
    }
    while (key != 'n' && key != 'N' );
 
  printf("\n >> Жмакни чо-нить для выхода...");
  getch(); // ожидание клавиши
 
  return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.08.2020, 10:02
Помогаю со студенческими работами здесь

Найти в строке палиндром максимальной длины
Задача: найти максимальной длины палендром. Решение: var Str: string; Found: boolean; function IsEqual(s: string):...

Найти в строке палиндром максимальной длины
Ограничение по времени: 1 секунда Ограничение по памяти: 64 мегабайта Как вы помните, месклениты отправились в экспедицию. Однажды...

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

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

Палиндром максимальной длины
Кролик Роджер очень любит играть. Особенно он любит играть палиндромом. Он так забавився палиндромом, что нечаянно уронил ... Беда, потому...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru