Форум программистов, компьютерный форум, киберфорум
Наши страницы
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
user1357
0 / 0 / 0
Регистрация: 06.11.2017
Сообщений: 8
1

Написать программу, которая будет составлять число, которое читается одинаково как слева направо, так и справа налево

25.12.2017, 10:47. Просмотров 673. Ответов 6
Метки нет (Все метки)

Текст задачи:
"На вход программе подается набор символов, заканчивающийся
символом 0 (в программе на языке Бейсик символы можно вводить по
одному в строке, пока не будет введен ноль, или считывать данные из
файла). Ноль в этом наборе единственный. Среди этих символов
обязательно присутствуют другие десятичные цифры. Напишите
эффективную, в том числе и по используемой памяти, программу (укажите
используемую версию языка программирования, например, Borland Pascal
7.0), которая будет составлять из имеющихся цифр число максимальной
длины, которое читается одинаково как слева направо, так и справа налево.
Нулей в числе быть не должно (ноль является признаком окончания ввода,
а не одним из символов). Если таких чисел несколько, то надо вывести
минимальное из них. Все имеющиеся в наборе цифры использовать не
обязательно, но количество цифр в ответе должно быть максимально
возможным."
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2017, 10:47
Ответы с готовыми решениями:

Определить является ли заданный текст симметричным (читается одинаково слева направо и справа налево)
Дан текст из 20 символов. Определить является ли он симметричным (читается...

Является ли число одинаково читающимся как справа налево, так и наоборот?
Установить, является ли заданное натуральное число n палиндромом (одинаково...

Определить в тексте слова, которые можно читать слева направо и справа налево (Анна, шалаш и т.д.).
Помогите пожалуста решить. Задача: Определить в тексте слова, которые можно...

Составить из имеющихся четных цифр максимальное число, читающееся одинаково слева направо и наоборот
На вход подается набор символов, оканчивающийся точкой. Количество символов не...

Найти в файле f все слова, слева направо и наоборот читаются одинаково и составить из них новый файл q
Найти в файле f все слова, слева направо и наоборот читаются одинаково и...

6
Joy
Эксперт Pascal/Delphi
2184 / 1208 / 1442
Регистрация: 29.08.2014
Сообщений: 4,425
03.01.2018, 09:15 2
так что-ли?
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
  a:array[0..9] of integer;
  i,j,k:integer;
  s:string;
  c:char;
begin
  repeat
    read(c);
    inc(a[ord(c)-48]);
  until c=#48;
  for i:=9 downto 1 do begin
    for j:=1 to a[i] div 2 do s:=s+chr(i+48);
    if (a[i] mod 2=1) and (k=0) then k:=i;
  end;
  s:=s+chr(k+48);
  for i:=length(s)-1 downto 1 do s:=s+s[i];
  writeln(s);
end.
Добавлено через 2 минуты
или так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
  a:array[0..9] of integer;
  i,j,k:integer;
  s:string;
  c:char;
begin
  repeat
    read(c);
    inc(a[ord(c)-48]);
  until c=#48;
  for i:=1 to 9 do begin
    for j:=1 to a[i] div 2 do s:=s+chr(i+48);
    if (a[i] mod 2=1) and (k=0) then k:=i;
  end;
  s:=s+chr(k+48);
  for i:=length(s)-1 downto 1 do s:=s+s[i];
  writeln(s);
end.
0
Puporev
Модератор
56085 / 42961 / 29716
Регистрация: 18.05.2008
Сообщений: 101,939
03.01.2018, 09:40 3
По моему нужно в строке посчитать символы, встречающиеся четное число раз, из них можно составить палиндром длины L=общее количество этих символов. Если в строке есть символы(символ), встречающиеся нечетное число раз то L:=L+1;
Из последних выбираем максимальный и ставим его в середину строки. Остальные символы начиная с самого маленького расставляем парами симметрично середины.
0
Joy
Эксперт Pascal/Delphi
2184 / 1208 / 1442
Регистрация: 29.08.2014
Сообщений: 4,425
03.01.2018, 10:11 4
Цитата Сообщение от Puporev Посмотреть сообщение
Из последних выбираем максимальный и ставим его в середину строки
не согласен, т.к. ТС нужно минимальное число.

Добавлено через 1 минуту
собственно, как Вы написали так я и изобразил в коде.
0
Puporev
Модератор
56085 / 42961 / 29716
Регистрация: 18.05.2008
Сообщений: 101,939
03.01.2018, 10:12 5
А, да, это количество цифр максимальное, а число минимальное, перепутал. Тогда все наоборот.
0
user1357
0 / 0 / 0
Регистрация: 06.11.2017
Сообщений: 8
11.01.2018, 16:36  [ТС] 6
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
  a:array[0..9] of integer;
  i,j,k:integer;
  s:string;
  c:char;
begin
  repeat
    read(c);
    inc(a[ord(c)-48]);
  until c=#48;
  for i:=9 downto 1 do begin
    for j:=1 to a[i] div 2 do s:=s+chr(i+48);
    if (a[i] mod 2=1) and (k=0) then k:=i;
  end;
  s:=s+chr(k+48);
  for i:=length(s)-1 downto 1 do s:=s+s[i];
  writeln(s);
end.
Можете описать алгоритм? Пока только начинаю работу с символами в паскале.
0
GHackwrench
0 / 0 / 0
Регистрация: 12.01.2018
Сообщений: 12
12.01.2018, 20:06 7
Pascal
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
program RawTcherv;
 
function IncPost(var I:integer):integer;
begin
  Result:=I;
  Inc(I);
end;
 
// из символов 1...9 из входной строки составить палиндром с минимальным значением
function MakeMinPalindromeMaxLength(const S:string):string;
var
  A:array[1..9] of byte;
  I,J,Fino,Cur,Center:integer;
begin
  FillChar(A{%H-},sizeof(A),0);
  // вычисляем количество разных цифр, встреченных во введённой строке
  For I:=1 to Length(S) do
    if S[I] in ['1'..'9'] then
      Inc(A[ord(S[I])-ord('0')])
    else
      break;
  // максимальная длина палиндрома равна длине строки
  Cur:=1;
  Center:=-1;
  SetLength(Result,Length(S));
  // составляем палиндром. В начало вставляем половину всех цифр от мин. к макс.
  For I:=1 to 9 do begin
    // поиск минимального числа, которое можно вставить в центр
    if (A[I] mod 2=1) and (Center<0) then
      Center:=I;
    // вставляем в начало строки половину символов
    Fino:=A[I] div 2;
    For J:=1 to Fino do
      Result[IncPost(Cur)]:=chr(I+ord('0'));
    // оставшуюся половину вставим потом
    A[I]:=Fino;
  end;
  // вставляем центральный символ
  if Center>0 then
    Result[IncPost(Cur)]:=chr(Center+ord('0'));
  // вставляем в обратном порядке символы палиндрома
  For I:=9 downto 1 do begin
    For J:=1 to A[I] do
      Result[IncPost(Cur)]:=chr(I+ord('0'));
  end;
  // восстанавливаем длину строки
  SetLength(Result,Cur-1);
end;
 
procedure Test(const S:string);
var
  S1:string;
begin
  S1:=MakeMinPalindromeMaxLength(S);
  Writeln('Orig=',S);
  Writeln('Pal =',S1);
  Writeln('Diff=',Length(S)-Length(S1));
  Writeln;
end;
 
begin
  Test('9998888776665432111');
  Readln;
end.
0
12.01.2018, 20:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2018, 20:06

Дано натуральное число. Найти число, получаемое при прочтении его цифр справа налево
помогите с паскалем. Дано натуральное число. Найти число, получаемое при...

Напечатать число, получаемое при прочтении его цифр справа налево
Дано натуральное число. а) Напечатать число, получаемое при прочтении его цифр...

Слова, одинаково читающиеся справа налево и слева направо
Дана строка, состоящая из слов, разделенных пробелами (одним или несколькими)....


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru