Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ И снова палиндромы

Автор: James Montegry 11.12.2007 13:13

Знаю, что тем о палендроме уже открыто очень много, но в них я не нашел именно того, что мне нужно.

Для начала нужно ввести с клавиатуры число N, которое означает количество чисел в строчке. Ниже, ввести в строчку целые числа(через пробел), среди которых нужно найти самые длинные палиндромы. Количество чисел в строке зависит от N.

Автор: volvo 11.12.2007 13:43

И что конкретно из этого всего вызывает затруднения? Не можешь ввести N? Или проблема со считыванием после этого N чисел? Или способа проверки числа на "палиндром", выложенного в FAQ-е недостаточно, и специально для тебя надо переписать его еще и здесь? Где затруднения?

Автор: James Montegry 11.12.2007 13:55

volvo

Цитата
Не можешь ввести N? Или проблема со считыванием после этого N чисел? Или способа проверки числа на "палиндром"


И первое, и второе, и третее. У меня затруднения с созданием кода, так как я Паскаль не знаю. А что касается Факю, то в них я не нашел ничего, что может подойти именно в моем случае. Как определять палиндром я нашел, но вот как определить его с целого ряда цифр, я не знаю.

Цитата
специально для тебя надо переписать его еще и здесь?

Копипаст - это не сложно, я щитаю.

volvo, умоляю о помощи, мне срочно нужно.

Автор: volvo 11.12.2007 14:11

Цитата
Копипаст - это не сложно, я щитаю.
Я так не считаю, вот в чем дело... Незачем копировать десятки раз одно и то же. Для этого и есть Frequently Asked Questions, чтобы не заниматься сплошным копи-пастом...

Цитата
Как определять палиндром я нашел, но вот как определить его с целого ряда цифр, я не знаю.

По одному числу передавать в функцию:

{ здесь is_palindrom из FAQ-а }

type
PT = ^T;
T = array[1 .. 1] of longint;
var
arr: PT;
n, count, i: integer;
X: longint;
begin
write('n = '); readln(n);
getmem(arr, n * sizeof(longint));
count := 0;
while not eoln do begin
read(X);
if is_palindrom(X) then begin
inc(count); arr^[count] := X;
end;
end;

for i := 1 to count do
writeln(arr^[i]);
freemem(arr, n * sizeof(longint))
end.

Если вместо занесения в массив палиндрома сразу же проверять его длину и заносить в массив только числа максимальной длины - то получишь именно то, что тебе нужно... Пробуй...

Автор: James Montegry 11.12.2007 14:56

Я все сделал как ты сказал, но прога вместо палиндромов, просто выдает все числа, которые я ввел. Вот код проги:

Код
Program symmetry;
function is_palindrom(x: longint):boolean;
var prev, T: longint;
begin
  prev:=x;
  T:=0;
  while x<>0 do begin
    T:=T*10+(x mod 10);
    x:=x div 10;
end;

is_palindrom:=(prev=T)
end;
type
PT=^T;
T=array[1..1] of longint;
var
arr: PT;
n,count,i:integer;
X: longint;
begin
write('n= '); readln(n);
getmem(arr, n * sizeof(longint));
count:=0;
while not eoln do begin
  read(X);
  if is_palindrom(X) then begin
   inc(count); arr^[count]:=X;
  end;
end;

for i:=1 to count do
  writeln(arr^[i]);
freemem(arr,n * sizeof(longint))
end.

Автор: volvo 11.12.2007 15:16

Что ты говоришь? А какие ты ввел числа, я что, догадаться должен? У меня пример работает, я вообще не имею привычки непроверенный код выкладывать...

Цитата(Console)
Running "g:\programs\pascal
n= 4
21 54 85 55
55

Автор: James Montegry 11.12.2007 15:42

n=6
1 2 2 1 0 7
1
2
2
1
0
7
а должно показывать только палиндромы(1 2 2 1)

Автор: volvo 11.12.2007 15:44

Да? С какого перепуга? Числа рассматриваются ПО ОТДЕЛЬНОСТИ!
"1" - это палиндром? Да, попробуй опровергнуть...
"2" - то же самое...

А может быть, "7" - не палиндром? Семерка что, читается "вперед" и "назад" как-то по-разному?

Задание нормально сформулируй (и не дублируй топики - это к добру не приведет, ты, оказывается, уже задавал этот же вопрос здесь: http://forum.pascal.net.ru/index.php?showtopic=20566 ...)

Автор: James Montegry 11.12.2007 15:52


Нужно найти не числа-палиндромы, а цепочки-палендромы(типо не число 1221, а последовательность, скажем, 4 цифер 1 2 2 1).

Автор: volvo 11.12.2007 15:55

А теперь перечитай свое первое сообщение... В какой именно строчке фигурирует слово "цепочки", можно узнать?

У тебя написано так:

Цитата
ввести в строчку целые числа(через пробел), среди которых нужно найти самые длинные палиндромы
И что должен понять тот, кто читает тему? Где цепочки-то?

Автор: James Montegry 11.12.2007 15:56

извини, я немного туплю. Просто целую ночь над задачей сижу.

Автор: volvo 11.12.2007 16:13

В таком случае (я про задачу), тебе вообще лучше работать со строкой, а не с числами:

function space(s: string): boolean;
begin
space := (s[1] = ' ') and (s[length(s)] = ' ');
end;
function trim(s: string): string;
begin
while (s <> '') and (pos(' ', s) > 0) do
delete(s, pos(' ', s), 1);

trim := s;
end;
function revert(s: string): string;
var
rev: string;
i: integer;
begin
rev := '';
for i := 1 to length(s) do rev := s[i] + rev;
revert := rev;
end;

var
i, j: integer;
s, st, max_s: string;

begin
{
s := '1 2 2 1 0 7';
s := '1 2 2 1 33 21 12 33 1 5';
s := '1 2 2 1 33 21 12 373 1 5';
}
readln(s);

s := ' ' + s + ' ';

max_s := '';
for i := 1 to length(s) - 1 do begin
for j := 1 to length(s) - i do begin
st := copy(s, i, j);
if space(st) and (trim(st) = revert(trim(st))) then begin
if length(max_s) < length(st) then max_s := st;
end;
end;
end;
writeln(max_s);
end.

Тестировалось на закомментированных значениях - вроде выдает правильный результат...

Автор: James Montegry 11.12.2007 16:19

Большое спасибо. Почему я не могу дать плюсик? Когда я клацаю, ничего не происходит.

Автор: volvo 11.12.2007 16:26

Смотри здесь: http://forum.pascal.net.ru/index.php?s=&showtopic=15545&view=findpost&p=92448

Автор: Michael_Rybak 11.12.2007 20:41

М
Плюсик за тебя добавил. Темы не дублируй.