![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Айра |
![]()
Сообщение
#1
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 731 Пол: Женский Репутация: ![]() ![]() ![]() |
Цитата Для любого натурального n найти число, составленное из 1-ц и 2-ек, делящееся на 2n Вот что у меня получилось: var n,n2,a,d,x,ch: longint; Вроде работает нормально.. но может можно что-то упростить или сделать лучше? ![]() |
![]() ![]() |
КМА |
![]()
Сообщение
#2
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 69 Пол: Мужской Репутация: ![]() ![]() ![]() |
Во всяком случае мне сразу бросается в глаза:
Код n2:=2*n; я бы заменил на: Код n2:=n+n; И еще между repeat и until использовать логические скобки (begin и end) не обязательно Сообщение отредактировано: КМА - 1.11.2007 0:16 |
volvo |
![]()
Сообщение
#3
|
Гость ![]() |
KMA
А зачем? Менять - так уж менять на n2 := n shl 1 Оля, if (ch<>1) and (ch<>2) then f:=false;меняем на f := (d mod 10) in [1 .. 2]; { <--- переменная ch больше не нужна} Лишний Begin/End тоже убираем (Repeat сам по себе является операторной скобкой...) P.S. Описание max тоже не нужно... Есть MaxLongInt в Турбо Паскале... Сообщение отредактировано: volvo - 1.11.2007 0:19 |
КМА |
![]()
Сообщение
#4
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 69 Пол: Мужской Репутация: ![]() ![]() ![]() |
Еще наверное, логично будет поставить условие, на то, если вдруг предел перскочит. И вроде еще директиву надо включить от переполнения?
|
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
![]() |
Malice |
![]()
Сообщение
#6
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: ![]() ![]() ![]() |
Учитывая, что max= MaxLongInt условие a>max сработать не сможет и вероятна ситуация при которой а вылетит с переполнением и станет меньше max. Поэтому можно на всякий случай добавить еще одно условие:
until (a>=max) or f or (a<0); Ну и после на это тоже проверить, т.к. результат не получен, вывести соответствующее сообщение. ;) Сообщение отредактировано: Malice - 1.11.2007 0:27 |
мисс_граффити |
![]()
Сообщение
#7
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
может, проще так проверять:
если (max-a<n2) - то и незачем n2 прибавлять... -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
Айра |
![]()
Сообщение
#8
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 731 Пол: Женский Репутация: ![]() ![]() ![]() |
Цитата Кодn2:=2*n; я бы заменил на: Кодn2:=n+n; Хм.. а это потому что сложение выполняется быстрее умножения ![]() Исправления внесла, всем спасибо)) Цитата ..то и незачем n2 прибавлять... С n2 я так поняла: вот, например, когда я ввожу 6, то n2=12 - уже подходит, а если я введу 2 - будет сначала 4, потом 8, и только потом 12.. т.е. чтобы добраться до искомого числа мне нужно двигаться с шагом n2, или можно как-то по-другому? Сообщение отредактировано: Айра - 1.11.2007 1:50 |
Malice |
![]()
Сообщение
#9
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 705 Пол: Мужской Репутация: ![]() ![]() ![]() |
С n2 я так поняла: вот, например, когда я ввожу 6, то n2=12 - уже подходит, а если я введу 2 - будет сначала 4, потом 8, и только потом 12.. т.е. чтобы добраться до искомого числа мне нужно двигаться с шагом n2, или можно как-то по-другому? Можно попробовать зайти с другой стороны.. Идти именно по числам, состоящим из 1,2 и проверять на делимость с 2*n. Количество таких чисел по идее меньше (769 всего до MaxLongInt) чем MaxLongINt / 2*n (Хотя это конечно от N зависит ![]() ![]() Вот примерчик: var s,p,i,x,n:longint; |
Айра |
![]()
Сообщение
#10
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 731 Пол: Женский Репутация: ![]() ![]() ![]() |
Спасибо, Malice
![]() У меня были мысли по поводу именно 1,2-х чисел, но как реализовать я бы не догадалась. Буду разбираться)) Еще раз всем спасибо)) |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
"Раз пошла такая пьянка" (С)
![]() Оля, еще один способ (правда, чуть более медленный, ибо - рекурсия, но вроде изначально о предельной скорости выполнения речь не шла) вывода нужных тебе чисел: var (если убрать махинации с min - то будут напечатаны ВСЕ числа в интервале 1 .. MaxLongInt, делящиеся на 2n) |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 12:18 |