Помощь - Поиск - Пользователи - Календарь
Полная версия: двусвязные список, последовтельность чисел
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Катюша
Ввести последовательность натуральных чисел. Если последовательность упорядочена по невозрастанию первой или последней цифры, удалить из последовательности составные числа и продублировать простые числа, содержащие цифры 1,5 или 7. В противном случае упорядочить последовательность по неубыванию. Последовательность хранить в двусвязном СПИСКЕ. Перед завершением программы очистить динамическую память с помощью процедуры Release.

помогите пожалуйста написать программу smile.gif
volvo
А вот тут поясни:
Цитата(Катюша @ 22.07.05 22:46)
удалить из последовательности составные числа

что подразумевает понятие "составные"? Не являющиеся простыми, или что-то другое?
Катюша
если там речь идет о простых числах, то наверняка подразумеваются числа (под словом "составные") которые на что то делятся, кроме как на себя и на единицу.

в принципе, думаю, что наш препод такое толкование бы допустил.. если бы вот такое пояснение привели..
volvo
Полностью программу писать не буду, но вот в таком направлении надо двигаться (TList - это реализация двухсвязного списка, я ее выкладывал на форуме, в теме про ООП, но можно взять и реализацию Oleg_Z отсюда):
{ проверка, простое ли число (взято из FAQ)... }
function isPrime(X: word): boolean;
var
i: integer;
Begin
isPrime:=false;
for i:=2 to trunc(sqrt(x)) do
if x mod i = 0 then Exit;
isPrime:=true
End;

var
my_list: tlist; { это двухсвязный список }
i: integer;

p: ptitem;
is_ok: boolean;
T: integer;
digit_set: set of byte;
before_list: Pointer;

begin
my_list.init;

mark(before_list); { потом к этому состоянию вернемся через release }

for i := 1 to 10 do
my_list.append(arr[i]); { заполняем список }
my_list.print; { и печатаем, для проверки }

{ проверяем на упорядоченность }
p := my_list.first;
is_ok := true;
while assigned(p) do begin

if p^.next <> nil then
{ это проверка на невозрастание последней цифры,
если надо - сюда же можешь добавить и первую,
но так как числа могут быть и 1, и 2, и 3-значными,
может возникнуть проблема }
is_ok := is_ok and ((p^.info mod 10) >= (p^.next^.info mod 10));
p := p^.next;

end;

if is_ok then begin { последовательность упорядочена, делаем что надо: }

{ опять проходим по списку с начала }
p := my_list.first;
while assigned(p) do begin

if not isPrime(p^.info) then
{ число - составное, удаляем элемент }
my_list.remove_item(p)
else begin { число простое }
{ здесь - проверяем на наличие цифр 1, 5, 7 в числе
я бы делал так: }
T := p^.info;
while T > 0 do begin
digit_set := digit_set + [(T mod 10)]; T := T div 10;
end;
{ если присутствует одна из цифр 1, 5, 7 то
продублировать данное значение }
if (1 in digit_set) or (5 in digit_set) or (7 in digit_set) then
my_list.insert_after(p, p^.info);
end;

p := p^.next;

end;
end
else begin
{ список неупорядочен - просто отсортируй его любым способом }
end;

my_list.print; { опять для проверки }

{ возвращаемся к ранее запомненному состоянию
кучи - список будет удален }
release(before_list);

end.
Катюша
посмотрю, что смогу сделать.. если будут вопросы- задам
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.