miss_graffiti
Долгожитель
|
Katerina, ну да... местами или. но кое-где все же останется и.
|
Всего сообщений: 670 | Присоединился: сентябрь 2005 | Отправлено: 23 дек. 2006 0:33 | IP
|
|
KMA
Долгожитель
|
miss graffiti, я понял это, совсем недавно. Да тупил. Может просто замусолилась задача. Ну в общем, я нерационально нашел решение, согласен. Но понял я это только сегодня, когда сидел, на уроке. =)
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 23 дек. 2006 0:57 | IP
|
|
norma
Удален
|
Здравствуйте. Позвольте со своей проблемой. Задача из зачетных 1-го курса 1-го семестра мех-мата, с предварительным пояснением, звучит так: В последующих задачах под удалением элемента массива следует понимать исключение этого элемента из массива путем смещения всех следующих за ним элементов на 1 позицию. Последнему элементу массива присваивается значение 0. Дан массив, состоящий из N целых чисел. Удалить из массива каждый второй элемент. Значение номера определяется по положению в исходном массиве. Решение напросилось, примерно, такое: Пусть количество элементов в массиве n. Поделим его на 2, округлив до ближайшего целого, получим число m - количество неудаленных (оставшихся) элементов. Далее цикл по i от 2 до m, переприсваиваем: mas(i):=mas(2*i-1) , и ещё один цикл по i от m+1 до n, в котором зануляем оставшиеся элементы: mas(i):=0 Но данный способ как-то не вяжется с методой предварительного пояснения к задаче. Как должен выглядеть более грамотный алгоритм? Спасибо. (Если это возможно, то подробнее и с пояснениями).
|
Всего сообщений: N/A | Присоединился: N/A | Отправлено: 23 дек. 2006 19:20 | IP
|
|
miss_graffiti
Долгожитель
|
Почему же не вяжется? В пояснении оговаривается только одно: фактического удаления не происходит (то есть было в массиве 5 элементов, 5 и осталось). Псевдоудаление осуществляется путем сдвига - ты это и делаешь. В общем, имхо, все правильно.
|
Всего сообщений: 670 | Присоединился: сентябрь 2005 | Отправлено: 23 дек. 2006 19:38 | IP
|
|
norma
Удален
|
Мой подход - он как бы больше от математических соображений, чем алгоритмических. И вследствие этого, как-то не обобщенно выглядит. И есть предположение, что предисловие к задаче необходимо понимать как жесткое предписание к способу составлению алгоритма. На самом деле мне кажется, что необходимо организовать алгоритм так, что бы в нём просвечивалась как-бы по-элементная последовательность действий в цикле: сместил вперёд - занулил хвост, потом следующее смещение - и опять занулил уже следующую вылезшую часть хвоста . . . и т.д. до окончания цикла. Но как обусловить эту процедуру для каждого второго элемента массива ?. Не соображу. Может быть я уже лишнего чего-то надумываю.
|
Всего сообщений: N/A | Присоединился: N/A | Отправлено: 23 дек. 2006 20:20 | IP
|
|
KMA
Долгожитель
|
norma, в принципе ваш метод очень хорош, и даже наиболее правилен для данной задачи. Самый быстрый алгоритм. Если же ваше жесткое предписание, то делаете одну общую процедуру, такого типа: procedure sdvigInMassiv (Var mas: massiv; n, m: byte); Var buf: integer; i: byte; Begin {n это количество элементов в массиве, m номер элемента, которого надо удалить} mas[m]:=0; for i:=m to n-1 do begin buf:=mas[ i ]; mas[ i ]:=mas[i+1]; mas[i+1]:=buf end End; Я не говорю, что мой метод самый рациональный, можно написать и лучше. Типа такого for i:=m to n-1 do mas[ i ]:=mas[i+1]; mas[n]:=0; Можно и так, покороче. А твоя задача тогда решиться следующим образом. for i:=2 to (n div 2)+1 do sdvigInMassiv (mas, n, i); Но лучше всегда индивидуальный подход, тогда задача решается быстрее. (Сообщение отредактировал KMA 24 дек. 2006 0:09)
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 23 дек. 2006 22:46 | IP
|
|
Guest
Новичок
|
Здраствуйте! Помогите плиз с задачей: Дана действительная матрица А размером N*M. Назовем «особым» элемент А(i,j), если в его строке слева от него элементы составляют строго монотонную последовательность, а справа все элементы являются простыми числами. Вывести на экран количество «особых» элементов. Я не могу понять какая процедура нужна для выщитывания монотонной последовательности и для простых чисел. (что такое простые числа, и монотонная последовательность я понимаю).
|
Всего сообщений: Нет | Присоединился: Never | Отправлено: 24 дек. 2006 0:17 | IP
|
|
KMA
Долгожитель
|
Помогите если можете. Дан файл со строками из строки нужно удалить все цифры
Guest правильно подсказал, единственное, что надо немного подкорректировать, если символ удалить, то ты можешь перескочить, это можно исправить немного изменив. i:=1; while i<length (s) do if s[ i ] in ['0'..'9'] then delete (s, i, 1) else inc (i); Есть и другой способ, он может и быстрее, это перекопировать все в новую строчку, при этом исключая все цифры. stroka:=''; for i:=1 to length (s) do if not (s[ i ] in ['0'..'9']) then stroka:=stroka+s[ i ]; Какой из них лучше решать тебе. С одной стороны, мы и там и там делаем n шагов, где n длина строки, но во втором случае однозначно n, при этом копирая, а в первом, возможно и меньше но там мы удаляем (сдвигаем), поэтому это занимает немного больше операций.
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 24 дек. 2006 1:51 | IP
|
|
Guest
Новичок
|
Помогите! Опишите пожалуйста процедуру нахождения простого числа?
|
Всего сообщений: Нет | Присоединился: Never | Отправлено: 24 дек. 2006 2:29 | IP
|
|
Guest
Новичок
|
Хотябы словестно опишите пожалуйста.
|
Всего сообщений: Нет | Присоединился: Never | Отправлено: 24 дек. 2006 2:30 | IP
|
|
|