(знаю, что вставлять готовое решение нельзя, просто иначе не понятно будет, наверно. Понимаю если придется удалить данный вопрос и извиняюсь за нарушение)
Хотел бы понять зачем тут continue; , я его вставил просто в конце цикла т.к. это нужно по условию, но я так и не понял зачем, если и так все прекрасно работает?
Scanner scanner = new Scanner(System.in);
int start = scanner.nextInt();
int end = scanner.nextInt();
int multiple = scanner.nextInt();
int sum = 0;
int i;
for (i=start;i<end;i++){
if (i%multiple==0) {
sum=sum+i;
continue; //если я это удалю, то вывод не меняется
}
}
//напишите тут ваш код
System.out.println(sum);
}
}
Lilleganso
4 уровень
зачем тут continue; ?
Обсуждается
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Lilleganso
9 апреля, 07:46
Огромнео спасибо за такой развернутый ответ
0
Ильгиз
9 апреля, 06:31
По условию, должна быть сумма только кратных чисел. Таким образом в случае, если условие верно, должна считаться сумма, иначе переход на следующую итерацию цикла. То есть переход на следующую итерацию должен быть не здесь, а в разделе "иначе"
0
ГоффMaster
9 апреля, 06:21
Сейчас в комменты может прийти Гофф, который как обычно скажет, что это вообще не оптимально, и что сумму ряда можно найти арифметически
Хаха, вот пришёл Гофф :))
Да, цикл не нужен, но если уж из образовательных соображений делать с ним, то тогда уж правильно - цикл должен быть с шагом multiple и перебирать только кратные числа, а не все подряд. Выигрыш по времени будет примерно 2 * multiple.
0
Anonymous #3303140
9 апреля, 07:34
И как это научит использованию continue?
0
ГоффMaster
9 апреля, 10:20
Никак. На этой задаче можно вполне наглядно научиться тому, что оператор continue вообще не нужен ;-)
0
Anonymous #3303140
8 апреля, 07:25
Это хороший вопрос. Можешь не удалять его, лучше оставь.
В твоём решении continue действительно не нужен. continue - это оператор, который говорит пропустить остаток тела цикла и перейти на следующую итерацию.
В этой задаче тебя знакомят с этим оператором, потому что эту задачу можно решить в том числе с использованием него:
Концепция в том, что при помощи использовния continue ты можешь отсечь все случаи, которые не требуют обработки в цикле, и оставить тело цикла работать только с теми случаями, которые тебя действительно интересуют.
Обычно эту концепцию используют, чтобы упростить код для понимания. По сути код выше тождественный такому:
Но пустые ифы использовать плохо, т.к. это бессмысленный мусор. Можно убрать первую ветку и оставить только вторую, что ты и сделал: И это абсолютно правильное решение, ничего плохого в нём нет (если не учитывать того фактора, что составители задачи хотели, чтобы ты использовал здесь именно continue).
Продолжение ниже +2
Anonymous #3303140
8 апреля, 07:29
В контексте такой задачи эти два решения абсолютно тождественные, нет ни разницы в сложности восприятия, ни оптимизации по подсчёту. Но если представить, что твоя задача сложнее, что логика работы цикла внутри себя тоже требует каких-то ветвлений, что внутри вызываются разные методы и всё такое, то continue позволяет избавиться по крайней мере от одного уровня отступа. Чем больше тебе приходится использовать отступов в коде, тем сложнее для восприятия становится код:
Сейчас в комменты может прийти Гофф, который как обычно скажет, что это вообще не оптимально, и что сумму ряда можно найти арифметически, т.е. за константные время и память, и что тебе для этого не нужен цикл. Он прав, но эти слова не учитывают того, что смысл в этой задаче образовательный, а не только логический. И образовательный смысл здесь именно в том, чтобы познакомить тебя с концепцией того, как правильно и в каких случаях можно использовать continue. А тем, кому хочет только использовать лучшие алгоритмы, стоит завести аккаунт на литкоде. Там задач куда больше и они куда интереснее, чем тут, но они менее прикладные. +3