Знаю, что тем о палендроме уже открыто очень много, но в них я не нашел именно того, что мне нужно.
Для начала нужно ввести с клавиатуры число 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;
whilenot eoln dobegin
read(X);
if is_palindrom(X) thenbegin
inc(count); arr^[count] := X;
end;
end;
for i := 1to 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" - не палиндром? Семерка что, читается "вперед" и "назад" как-то по-разному?
Задание нормально сформулируй (и не дублируй топики - это к добру не приведет, ты, оказывается, уже задавал этот же вопрос здесь: Симметрия чисел в массиве ...)
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;
beginwhile (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 := 1to 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 := 1to length(s) - 1dobeginfor j := 1to length(s) - i dobegin
st := copy(s, i, j);
if space(st) and (trim(st) = revert(trim(st))) thenbeginif length(max_s) < length(st) then max_s := st;
end;
end;
end;
writeln(max_s);
end.
Тестировалось на закомментированных значениях - вроде выдает правильный результат...
James Montegry
11.12.2007 16:19
Большое спасибо. Почему я не могу дать плюсик? Когда я клацаю, ничего не происходит.