Как найти палиндромы паскаль

fpc source logo.png







Deutsch (de)
English (en)



suomi (fi)
français (fr)




















Palindrome

A palindrome is a word, phrase, number, or other sequence of symbols or elements,
whose meaning may be interpreted the same way in either forward or reverse direction

Examples

English

  • racecar
  • A man, a plan, a canal: Panama
  • Madam I’m Adam

Arabic

  • مودته تدوم لكل هول * وهل كل مودته تدوم

Armenian

  • Արա իմ, առած դրամ՝ քաղաքեքաղաք մարդ ծառա մի արա
  • Սերամա՜հ եթե համարես

Finnish

  • saippuakivikauppias
  • No niin, on aamu. Kehua sinua kai saan, ah, ihana Kristian. Nait Sirkan, ah, ihana asia, kaunis. Au, hekumaa. No niin on.
  • No, oikotie vei Tokioon.

Russian

  • А роза упала на лапу Азора
  • луну дунул
  • лак резала зеркал

Function IsPalindome

This function is suitable for both ASCII and UTF-8 encoding.

function IsPalindome(const a_text: string): boolean;
var
  i, j       :longint;
  s1, s2, s3 :string;
begin
  s1 := UTF8LowerCase( a_text );
  j := length( s1 );
  i := 1;
  s2 := '';
  s3 := '';
  while ( i <= j ) do
    begin
      if s1[i] < #$C0 then  // ASCII
        begin
          if (s1[i] >= #$30) and (s1[i] < #$7B)then
            begin
              if (s1[i] > #$60) or (s1[i] < #$3A) then
                begin
                  s2 := s1[i] + s2;
                  s3 := s3 + s1[i];
                end;
              end;
            inc( i );
          end
        else
        begin
          begin
            if s1[i] < #$E0 then  // two byte
              begin
                if ((s1[i] > #$C2) and ( not
                  // Armenian punctuation
                  ((s1[i] = #$D5) and ((s1[i+1] >= #$99) and (s1[i+1] < #$A0)))
                  )) then
                  begin
                    s2 := s1[i]+ s1[i+1] + s2;
                    s3 := s3 + s1[i] + s1[i+1];
                  end;
                inc( i ,2);
              end
            else
              begin
                if s1[i] < #$F0 then  // three byte
                  begin
                    if not (
                      // General punctuation
                      (s1[i] = #$E2) and ((s1[i+1]= #$80)
                      or ((s1[i+1]= #$81) and (s1[i+2]< #$B0)))
                      ) then
                      begin
                        s2 := s1[i]+ s1[i+1] + s1[i+2]+ s2;
                        s3 := s3 + s1[i] + s1[i+1] + s1[i+2];
                      end;
                    inc( i ,3);
                  end
                else
                  begin
                    s2 := s1[i]+ s1[i+1] + s1[i+2]+ s1[i+3] + s2;
                    s3 := s3 + s1[i] + s1[i+1] + s1[i+2] + s1[i+3];
                    inc( i ,4);
                  end
              end;
          end;
        end;
    end;
  if s2 <> '' then result := s2=s3 else result := false;
end;

0 / 0 / 0

Регистрация: 22.09.2020

Сообщений: 52

1

Найти все числа- палиндромы

02.11.2020, 10:51. Показов 3327. Ответов 7


Студворк — интернет-сервис помощи студентам

Натуральное число называется палиндромом, если его запись читается
одинаково с начала и с конца (например, 4884, 393, 1). Найти все числа-
палиндромы, не превышающих 100, и при подъеме к квадрату также
дают палиндромы.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

02.11.2020, 10:51

7

Cyborg Drone

Модератор

9588 / 4908 / 3244

Регистрация: 17.08.2012

Сообщений: 15,346

04.11.2020, 21:45

2

Неправильный перевод: «

при подъеме к квадрату

«.
Правильный перевод: «при возведении в квадрат».

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
  i, j, n, k, p: integer;
begin
  for i := 0 to 1 do
    for j := 1 to 9 do
      begin
        n := (10 * i + 1) * j;
        k := n * n;
        p := 0;
        repeat
          p := 10 * p + k mod 10;
          k := k div 10
        until k = 0;
        if p = n * n then writeln(n, ' -> ', p)
      end;
  readln
end.



0



0 / 0 / 0

Регистрация: 22.09.2020

Сообщений: 52

05.11.2020, 11:30

 [ТС]

3

Пожалуйста, создайте блок-схему по коду.



0



Модератор

9588 / 4908 / 3244

Регистрация: 17.08.2012

Сообщений: 15,346

06.11.2020, 21:34

4

Лучший ответ Сообщение было отмечено NazarGan3215 как решение

Решение

Найти все числа- палиндромы



0



Вадим Тукаев

305 / 286 / 116

Регистрация: 23.01.2018

Сообщений: 933

09.11.2020, 20:33

5

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
function reversed(n: integer): integer;
var r: integer;
begin
    r := 0;
    while n <> 0 do begin
        r := r * 10 + n mod 10;
        n := n div 10;
    end;
    reversed := r;
end;
 
function ispalindrome(n: integer): boolean;
begin
    ispalindrome := n = reversed(n);
end;
 
var i: integer;
 
begin
    for i := 1 to 100 do begin
        if ispalindrome(i) and ispalindrome(sqr(i)) then begin
            writeln(i);
        end;
    end;
end.



0



Модератор

Эксперт Pascal/DelphiЭксперт NIX

7534 / 4394 / 2785

Регистрация: 22.11.2013

Сообщений: 12,588

Записей в блоге: 1

09.11.2020, 21:08

6

Cyborg Drone, Вадим Тукаев,
Вопрос на засыпку: 10 — это палиндром? Как это нет, 010 же



0



Модератор

9588 / 4908 / 3244

Регистрация: 17.08.2012

Сообщений: 15,346

10.11.2020, 00:50

7

bormant, без дополнительных оговорок — не палиндром. Использование незначащих цифр в задачах обычно оговаривается отдельно.



2



2878 / 1533 / 619

Регистрация: 19.03.2019

Сообщений: 5,121

10.11.2020, 10:12

8

Цитата
Сообщение от bormant
Посмотреть сообщение

Вопрос на засыпку: 10 — это палиндром? Как это нет, 010 же

bormant, а число 10 сколько знаков имеет? Ну оно относится к трёхзначным числам, двухзначным или к каким?
Это и есть ответ на ваш вопрос, является ли 10 палиндромом



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

10.11.2020, 10:12

8

while not eof(f) do //пока не конец файла
      begin
      readln(f,s);//читаем строки
      b:=true;//считаем что палиндром
      d:=length(s); //длина строки
      l:=d div 2;//середина строки
           for i:=1 to l do //смотрим символы первой половины
               if s[i]<>s[d+1-i] then b:=false;//если не совпадают с символом
                                               //симметричным от конца, меняем флаг
               if b=true then//если все совпадают
               begin
                    writeln (s,' palindrom'); //выводим да на экран
                    writeln(f1,s,' palindrom'); //и в файл
               end
               else //если нет, выводим нет
               begin
                    writeln(f1,s,' ne palindrom');
                    writeln(s,' ne palindrom');
               end;
      end;

Сегодня мы рассмотрим еще одну стандартную олимпиадную (уровня районной олимпиады) задачу: проверить, является ли НЕЧТО палиндромом.

Во-первых: что такое палиндром. Палиндром — это запись, которая одинаково читается слева направо и справа налево. Например, число 12321 можно считать палиндромом. Как и слово кабак. А бывают целые фразы — палиндромы: Аргентина манит негра; А роза упала на лапу Азора… Встречаются стихи — палиндромы и даже рассказы — палиндромы. О романах-палиндромах лично я не слышала, но я верю в людей.

Во-вторых: почему НЕЧТО. Потому, что в зависимости от того, исследуем мы на палиндромность число, слово или фразу — задача может быть решена по-разному. Давайте рассмотрим все варианты решений.

Итак, вариант 1.

Проверить, является ли число палиндромом.


Идея решения: вводим число a — то, которое будем проверять. Потом, используя цикл While — «пока» с помощью двух меняющихся в ходе выполнения цикла переменных b и c делаем следующую операцию: «откусываем» последнюю цифру от  a и запоминаем её как временное значение c. На следующем витке цикла мы умножаем полученное ранее  c на 10, и прибавляем следующую цифру… И так, пока не получим конечное число c,  которое по сути является числом a, записанным задом наперед.

Затем мы сравниваем a и c, и, если числа равны, выводим сообщение о том, что число — палиндром, или о том, что не палиндром, в противном случае.

Перед вами результат работы программы, реализовавшей эту идею решения:

Введите целое положительное число a=123456


c=6 b=12345


c=65 b=1234


c=654 b=123


c=6543 b=12


c=65432 b=1


c=654321 b=0


654321


Не палиндром


Понятен ли вам принцип? Возникает вопрос, как «откусить» цифру. Тут нам помогут функции div и  mod, о которых вы можете прочесть в Словарике. Коротко:

19:5=3 (остаток 4)

19 div 5 = 3

19 mod 5=4

Попробуйте решить задачу сами. Если не получится — смотрите в Решения к уроку 9.

Рассмотрим 2 вариант этой задачи. 

Проверить, является ли введенное слово палиндромом.

Тут в решении будет несколько интересных и новых моментов, так что я объясню прямо по ходу программы. Решение без комментариев вы можете увидеть в  Решения к уроку 9.

Итак:

Program pal_2;

Var

s: string;  — заводим переменную, в которой запомним наше слово.

i,f: byte; — две технических переменных: счетчик и «переключатель» «ДА» — «НЕТ»

begin 

write(‘String: ‘);  — запросили слово

 readln(s);            — запомнили слово

   f := 0;                   — обнулили переключатель 

for i := 1 to length(s) div 2 do  — ДЛЯ (for) i от 1 до ДЛИНЫ СЛОВА (length(s)) деленного на 2                                                       без остатка (div) ДЕЛАТЬ (do)

if s[i] <> s[length(s)-i+1] then — ЕСЛИ (if) дальше будет изменение в зависимости от номера                                                          шага: 
                                                     на первом шаге ПЕРВАЯ БУКВА (s[i], i=1) не равна                                                                          ПОСЛЕДНЕЙ БУКВЕ (s[длина слова — i, i=1, +1) 
                                                     на втором шаге ВТОРАЯ БУКВА (s[i], i=2) не равна                                                                          ПРЕДПОСЛЕДНЕЙ БУКВЕ (s[длина слова — i, i=2, +1)
                                                     и так до середины слова… 

   begin                                        — делать такой набор действий

writeln(‘No palindrome’);   — написать «Не палиндром»

        f := 1;                                   — присвоить f значение 1

 break                                   — прервать выполнение программы (ну смысл нам проверять                                                               слово до конца, если уже вторая пара букв, скажем, не                                                                    совпала?)

    end;                                            — конец блока действий, если » все плохо»

if f = 0 then write(‘Palindrome’);  — если к концу проверки не совпавших пар не нашлось, f                                                                         осталось равным 0, написать сообщение, что слово —                                                                       палиндром.

end.                                                   — конец программы.


Чем интересно это решение?

  • Во-первых, мы повторили оператор div, который использовали для сокращения количества шагов в цикле. Слово проверяется за количество шагов, равное половине длины слова. Это позволяет корректно проверять слова, состоящие из нечетного количества букв. Например, слово «КАБАК» будет проверено так: сравним первую и последнюю буквы — это «К», все хорошо. Затем сравним вторую и предпоследнюю. Обе — «А». У буквы «Б» нет пары, но ее наличие не мешает слову быть палиндромом. Эту букву мы вообще не проверяем, потому, что…
  • Во-вторых мы познакомились с оператором  length(s) , который считает ДЛИНУ любой переменной типа String, типа, который соответствует значению «много букв». Так вот, мы теперь можем узнать, сколько — много.
  • В-третьих посмотрите, почему цикл задан только до середины слова. На примере «КАБАК» — length(s) = 5. length(s) div 2 = 2. Именно по этой причине мы не трогали букву «Б», о чем было сказано в разделе «Во-первых».
  • В-четвертых, эта программа будет проверять ЛЮБЫЕ введенные символы. Т.е. ей будет все равно, введете вы реально существующее слово, случайный набор букв, число или смесь букв разных языков и цифр. Если введенная вами строка будет читаться одинаково с обоих концов — вам сообщат, что это — палиндром. 

А теперь — вариант 3.

Проверить, является ли палиндромом фраза.

Первый вариант решения не подходит, так как фраза не может быть типа integer. Второй вариант решения тоже не подходит, так как в фразе, в отличие от слова, есть пробелы между словами. И они крайне редко совпадают по своему положению при чтении с разных концов. Например, фразу «Кабак казак кабак» вариант 2 посчитает палиндромом. А вот фразу «Аргентина манит негра», с которой мы начинали — нет, так как на 6 шаге проверки встретятся буква «Т» из слова «Аргентина» и пробел перед словом «негра»… 

Но мы справимся и с этой задачей.

Итак, ход решения. Давайте сразу договоримся, что мы будем брать фразу из файла input.txt и выводить сообщение о том, палиндром это или нет, в файл output.txt.

Давайте будем считать, что в наших фразах для проверки будет не более 50 символов вместе с пробелами. 

Опираясь на этот факт мы заведем себе три массива типа CHAR:

  • Массив a, в который мы запишем всю введенную нам фразу, в том числе и пробелы, по одному символу в каждой a[ i ].
  • Массив b, в котором мы будем сохранять только те символы, которые окажутся НЕ пробелами.
  • Массив c, в который мы запишем массив b в обратном порядке.

Если бы мы точно знали, сколько символов в нашей фразе, мы могли бы сразу сократить программу на четверть, но…

Мы введем переменные типа INTEGER:

  • i , j — счетчики переменных. Уже при вводе массива a и массива b мы получим разное количество элементов. Ведь с пробелами наша фраза — пример «Аргентина манит негра» займет 21 элемент массива a (столько символов, включая пробелы, в этой фразе), и только 19 элементов массива b — откинем два пробела.
  • k — у меня в программе это счетчик итогового количества элементов в массиве b. Если я нахожу «не пробел» в массиве a, я записываю этот символ в массив b и увеличиваю k на 1. Тогда к концу цикла я буду знать, сколько у меня букв без пробелов в фразе.
  • d — эту переменную я использую при проверке совпадений массивов b и c. Если находится несовпадение — увеличивается на 1. В итоге я смогу даже сказать, сколько конкретно несовпадений в фразе, если они есть. В этой программе я не делала сброса при первом же несовпадении, но вы можете это сделать.
  • f, g — традиционные переменные типа TEXT для организации работы с файлами ввода и вывода.

С переменными разобрались. Теперь — ход работы:

Открываем файл input.txt и ДО КОНЦА ФАЙЛА (мы же помним про оператор eof?) записываем ВСЕ символы в массив a, а если символ оказывается НЕ ПРОБЕЛОМ, то и в массив b. 

В процессе мы считаем количество элементов, не являющихся пробелами.

Получив массив b, мы записываем его в обратном порядке в массив c. 


Затем мы сравниваем элементы массивов b и c. Если пара не совпадает, переменной d присваивается значение d+1.  


Если к концу сравнения d =0, выводим сообщение, что фраза — палиндром. В противном случае — что нет.

Перейти к содержанию

Удалить из строки пробелы и определить, является ли она перевертышем

Просмотров 2.9к. Обновлено 14 сентября 2021

Вводится строка. Удалить из нее все пробелы. После этого определить, является ли она палиндромом (перевертышем), т.е. одинаково пишется как с начала, так и с конца.

Задача состоит из двух подзадач: 1) удаление всех пробелов из строки и 2) проверка строки на «палиндромность».

Для удаления пробелов надо перебрать по символам строку. Если очередной символ пробел, то удалить его. При этом следующий символ окажется на месте текущего, а значит не следует увеличивать значение счетчика. Если очередной символ не пробел, то надо перейти к проверке следующего, т.е. увеличить значение счетчика.

Для проверки, является ли строка палиндромом, надо сравнить первую и вторую половины строк. При этом половинки сравниваются так, что первый символ сравнивается с последним, второй — с предпоследним, третий — с третьим с конца, и т. д. То есть если длина строки l, а символ первой половины i, то символ второй половины имеет индекс l-i+1.

Pascal

Язык Си

Python

КуМир

Basic-256

Понравилась статья? Поделить с друзьями:
  • Как найти парня по душе
  • Как найти бесплатные роблоксы на телефоне
  • Как найти папку data на виндовс 10
  • Как исправлю сообщу
  • Как правильно составить заявление в прокуратуру на банк