Задачка на массив |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Задачка на массив |
kent |
Сообщение
#1
|
Пионер Группа: Пользователи Сообщений: 50 Пол: Мужской Реальное имя: Андрей Репутация: 1 |
Есть такая задача:
Дано вещественное число R и массив размера N. Найти два элемента массива, сумма которых наиболее|наименее близка к данному числу. Подскажите как решать, а то я даже не знаю как начать... Сообщение отредактировано: kent - |
mlc |
Сообщение
#2
|
Гость |
Цитата(kent @ 12.07.05 14:23) Есть такая задача: Подскажите как решать, а то я даже не знаю как начать... Перебираешь все пары элементов, находишь разницу (R- сумма) по модулю, запоминаещь индексы обоих если ок. Все просто. Ps 2 Volvo: как скажешь |
kent |
Сообщение
#3
|
Пионер Группа: Пользователи Сообщений: 50 Пол: Мужской Реальное имя: Андрей Репутация: 1 |
Цитата(mlc @ 12.07.05 17:32) Перебираешь все пары элементов, находишь разницу (R- сумма) по модулю, запоминаещь индексы обоих если ок. Я все понял, в принципе я так и хотел делать, только вот единственное как перебрать элементы каждый с каждым (это ведь сколько комбинаций) да и ещё чтоб индексы запомнить, честно говоря как это все на практике выглядит не знаю, может пример покажет кто-нибудь... Сообщение отредактировано: kent - |
volvo |
Сообщение
#4
|
Гость |
Вот тут есть хорошее объяснение алгоритма генерации сочетаний (в присоединенном документе). Для твоего примера будет N оно и есть N, но M = 2, то есть будут генерироваться индексы всех возможных сочетании по 2 элемента из N: Генерация всех перестановок элементов
|
kent |
Сообщение
#5
|
Пионер Группа: Пользователи Сообщений: 50 Пол: Мужской Реальное имя: Андрей Репутация: 1 |
volvo, спасибо за ссылку... :thanks:
Вот вроде решил: :p1:
Только у меня в TP 7.0 после вывода результата выдает еще какую то лабуду похожую на нотный знак...??? Сообщение отредактировано: kent - |
volvo |
Сообщение
#6
|
Гость |
Ай-яй-яй... Нехорошо компилировать программы без ключа {$R+}
Попробуй поставить его в 1-ю строку программы, и ты увидишь, что в строке while a[i]=N-m+i do dec(i);происходит выход за пределы массива (Range-Check Error)... А это значит, что ни на что больше полагаться нельзя... Любые данные могут оказаться запорченными... |
Romtek |
Сообщение
#7
|
Знаток Группа: Пользователи Сообщений: 303 Пол: Мужской Реальное имя: Роман Репутация: 2 |
Выход за пределы нужно всегда проверять!
смотрим код: repeatТ.е. нужно добавить проверку (K<=1000) Далее... while a[i]=N-m+i do dec(i);Где проверка (i > 1) ? Должно быть так: while (i>1) and (a[i]=N-m+i) do dec(i); -------------------- Romiras HomeLab- материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и прочее.
|
Romtek |
Сообщение
#8
|
Знаток Группа: Пользователи Сообщений: 303 Пол: Мужской Реальное имя: Роман Репутация: 2 |
Проверку на K нужно добавлять на строке until:
until (i=0) or (k = 1000); -------------------- Romiras HomeLab- материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и прочее.
|
kent |
Сообщение
#9
|
Пионер Группа: Пользователи Сообщений: 50 Пол: Мужской Реальное имя: Андрей Репутация: 1 |
Цитата(volvo @ 13.07.05 13:14) Ай-яй-яй... Нехорошо компилировать программы без ключа {$R+} А что это за ключ и для чего он нужен? |
kent |
Сообщение
#10
|
Пионер Группа: Пользователи Сообщений: 50 Пол: Мужской Реальное имя: Андрей Репутация: 1 |
Romtek, поставил проверку как ты сказал, вроде больше этот знак не вылезает...
Спасибо что поправил! |
Romtek |
Сообщение
#11
|
Знаток Группа: Пользователи Сообщений: 303 Пол: Мужской Реальное имя: Роман Репутация: 2 |
Нужен для проверки выхода за пределы границ массива. Тогда программа прервётся с ошибкой 201.
Можно выставить в опциях IDE: Options -> Compiler -> [X] Range checking И сохранить установки. Сообщение отредактировано: Romtek - -------------------- Romiras HomeLab- материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и прочее.
|
kent |
Сообщение
#12
|
Пионер Группа: Пользователи Сообщений: 50 Пол: Мужской Реальное имя: Андрей Репутация: 1 |
Теперь понял...
Еще раз спасибо всем кто помогал. :thanks: |
Текстовая версия | 4.05.2024 14:55 |