Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 1
Регистрация: 11.02.2015
Сообщений: 14

Определить, является ли шестнадцатеричное представление данного натурального числа палиндромом

24.03.2015, 21:21. Показов 2290. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую, форумчане. Есть у меня небольшая проблемка. Очень надеюсь на Вашу помощь.
Дано задание для языка C: "Определить, является ли шестнадцатеричное представление данного натурального числа палиндромом."
Его я решаю следующим образом:
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <locale>
 
int main()
{
    setlocale(LC_ALL, "");
 
    unsigned int n;
    unsigned int  mask = 0xF0000000;
    unsigned int  mask2 = 0x0000000F;
    int i;
    int j;
    int start = 8;
    int polyndrome = 1;
 
 
    printf("Введите число: ");
        scanf("%i", &n);
 
    for (i = 0; i < 8; ++i)
    {
        if ((n & mask) == 0)
        {
            mask >>= 4;
            mask &= 0x0FFFFFFF;
            --start;
        }
        else break;
    }
 
    for (i = 0, j = start; (i < j) && (polyndrome != 0); ++i, --j)
    {
        if (((n & mask) >> ((j - 1) * 4)) != ((n & mask2) >> (i * 4))) polyndrome = 0;
        mask >>= 4;
        mask2 <<= 4;
    }
 
    printf("%x", n);
    printf("\n");
    if (polyndrome == 1)
        printf("Шестнадцатеричное представление данного числа является палиндромом");
    else
    printf("Шестнадцатеричное представление данного числа не является палиндромом");
 
    _getch();
}
Все работает, все хорошо. Но мне необходимо переписать эту программу на языке Pascal для следующего задания: "Определить, является ли восьмеричное представление данного натурального числа палиндромом."
Я пробую вот так:
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
uses crt;
 
var
  n: word;
  mask, mask2: word;
  i,j, start: byte;
  f: boolean;
 
begin
  mask:=61440;
  mask2:=15;
  start:=4;
  f:=true;
  read(n);
 
  while i<4 do
    if n and mask = 0 then
      begin
        mask:= mask shr 4;
        mask:= mask and 4095;
        start:=start-1;
        i:=i+1;
      end
    else
      break;
 
  i:=0;
  j:=start;
  while (i<j) and (f) do
    begin
      if ((n and mask) shr ((j-1)*4)) <> ((n and mask2) shr (i*4))
      then f:=false;
        i:=i+1;
        j:=j-1;
        mask:=mask shr 4;
        mask2:=mask2 shl 4;
    end;
  writeln(f);
  readkey;
end.
Но программа нормально не работает. Не могли бы Вы подсказать, в чем моя ошибка?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.03.2015, 21:21
Ответы с готовыми решениями:

Представление натурального числа в виде суммы ряда относительно заданного натурального основания
Представление натурального числа в виде суммы ряда относительно заданного натурального основания...

Представление натурального числа в виде суммы ряда относительно заданного натурального основания
Представление натурального числа в виде суммы ряда относительно заданного натурального основания?

Определить, является ли четыричное представление данного числа полиндромом
Побитовые операции в Pascal Определить является ли четыричное представление данного числа...

11
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4494 / 1669
Регистрация: 01.02.2015
Сообщений: 13,905
Записей в блоге: 12
24.03.2015, 22:31
А в восьмеричном разряде сколько бит 3 или 4?
0
0 / 0 / 1
Регистрация: 11.02.2015
Сообщений: 14
24.03.2015, 23:31  [ТС]
3 бита, по-моему.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4494 / 1669
Регистрация: 01.02.2015
Сообщений: 13,905
Записей в блоге: 12
24.03.2015, 23:42
Мне кажется, что я помог...
0
0 / 0 / 1
Регистрация: 11.02.2015
Сообщений: 14
24.03.2015, 23:44  [ТС]
Есть у меня вопрос, небольшой. Какое тогда значение должно быть у переменной start? Маски остаются те же, что и были, верно? Или как их тогда пересчитать?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4494 / 1669
Регистрация: 01.02.2015
Сообщений: 13,905
Записей в блоге: 12
24.03.2015, 23:57
Мне сложно понять, что такое start.
Маски... Ну подумай сам, какой должна быть маска (и сдвиг) для выделения 3-х бит.
0
0 / 0 / 1
Регистрация: 11.02.2015
Сообщений: 14
25.03.2015, 00:27  [ТС]
Пока оставлю так. Если кто знает, как захватить весь диапазон значений типа word, а не только до 28672, напишите, пожалуйста.

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
uses crt;
 
 
function start(n: word; var mask: word): byte;
 
var
  i: byte;
  t: byte;
begin
  t:=5;
  i:=0;
  while i<5 do
    if n and mask = 0 then
      begin
        mask:= mask shr 3;
        mask:= mask and 4095;
        t:=t-1;
        i:=i+1;
      end
    else
      break;
  start:=t;
end;
 
function palindrome(n: word): boolean;
 
var
  i,j: byte;
  mask, mask2: word;
  f: boolean;
 
begin
  mask:=28672;
  mask2:=7;
  f:=true;
  i:=0;
  j:=start(n, mask);
  while (i<j) and (f) do
    begin
      if ((n and mask) shr ((j-1)*3)) <> ((n and mask2) shr (i*3))
      then f:=false;
        i:=i+1;
        j:=j-1;
        mask:=mask shr 3;
        mask2:=mask2 shl 3;
    end;
  palindrome:=f;
end;
 
var
  n: word;
 
begin;
  clrscr;
 
  write('Введите число от 0 до 28672: ');
  readln(n);
  writeln('Палиндром ',  palindrome(n));
  readkey;
end.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
25.03.2015, 00:33
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 ToOct(n: Longint): String;
var
  r: String;
begin
  r:=0;
  repeat
    r:=Chr(Ord(n and 7)+Ord('0'))+r;
    n:=n shr 3;
  until n=0;
  ToOct:=r;
end;
function IsPalindrome(const s: String): Boolean;
var i: Integer;
begin
  IsPalindrome:=False;
  for i:=1 to Length(s) div 2 do
    if s[i]<>s[Length(s)-i+1] then Exit;
  IsPalindrome:=True;
end;
var
  n: Longint;
begin
  ReadLn(n);
  WriteLn(IsPalindrome(ToOct(n)));
end.
Добавлено через 5 минут
Другой вариант проверки палиндрома:
Pascal
1
2
3
4
5
6
7
8
9
function IsPalindrome(const s: String): Boolean;
var i, j: Integer;
begin
  i:=1; j:=Length(s);
  while (i<j) and (s[i]=s[j]) do begin
    Inc(i); Dec(j);
  end;
  IsPalindrome:=i>=j;
end;
0
0 / 0 / 1
Регистрация: 11.02.2015
Сообщений: 14
25.03.2015, 00:36  [ТС]
Моя ошибка, что не указал в первом посте. Пользоваться можно только побитовыми операциями. Строками пользоваться нельзя.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4494 / 1669
Регистрация: 01.02.2015
Сообщений: 13,905
Записей в блоге: 12
25.03.2015, 00:57
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
program OctalPalindrome;
 
var
  n: word;
  S: word; {количество разрядов в octal представлении числа n данного целого типа}
  mask: word;
  Res: boolean;
  Left, Right: integer;
begin
  n := 4 + 8 * (5 + 8 * (6 + 8 * (5 + 8 * (4 + 8 * 0))));
  writeln(n);
  mask := 7;
  S := (SizeOf(n) * 8) div 3;
  if ((SizeOf(n) * 8) mod 3) <> 0 then
    Inc(S);
  {ищем крайний левый разряд}
  Left := S - 1;
  while ((n shr (Left * 3)) and mask) = 0 do
    Dec(Left);
  {теперь берём по одной 8-ричной цифре числа и сверяем}
  Res := True;
  Right := 0;
  while Right < Left do
  begin
    if ((n shr (Left * 3)) and mask) = ((n shr (Right * 3)) and mask) then
    begin
      Inc(Right);
      Dec(Left);
    end
    else
    begin
      Res := False;
      break;
    end;
  end;
  if Res then
    writeln('Palindrome')
  else
    writeln('No');
end.
Некрасивы код. Всё в кучу.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,901
Записей в блоге: 12
25.03.2015, 02:50
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

poikl,
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
  n, T, rev : word;
 
begin
//  n := 1098;  // Octal 2112
//  n := 2412;  // Octal 4554
//  n := 17620; // Octal 42324
  n := 65529;   // Octal 177771
  rev := 0; T := n;
  while T > 0 do
  begin
    rev := rev shl 3;
    rev := rev or (T and $7);
    T := T shr 3;
  end;
 
  writeln(n = rev);
end.
Все перечисленные варианты отрабатывают корректно
2
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4494 / 1669
Регистрация: 01.02.2015
Сообщений: 13,905
Записей в блоге: 12
25.03.2015, 07:59
Спасибо! Я вот чувствовал, что есть изящное решение.
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.03.2015, 07:59
Помогаю со студенческими работами здесь

Определить, каких цифр нет в шестнадцатеричном представлении числа представлении
Создание программы, использующей тип данных «множество». Дано 10-ое число. Какие цифры не...

Определить количество простых чисел, не превосходящих заданное число (N<16000), шестнадцатеричная форма записи которых является палиндромом
Помогите написать программу. Задача: Определить количество простых чисел, не превосходящих...

Определить, является ли натуральное число n (n<=9999) палиндромом
4. Определить, является ли натуральное число n (n&lt;=9999) палиндромом (перевертышем) с учетом ...

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

Дано натуральное число. Определить, является ли оно палиндромом
Дано натуральное число. Определить, является ли оно палиндромом. Число-палиндром можно читать...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru