Как уже отмечалось, проблема заключается в том, что поток управления не делать то, что вы думаете, что он делает. Это общая проблема начинающих.
Мое предложение для вас: узнать, как использовать отладчик. Начинающие часто имеют эту странную идею, что им не разрешено использовать инструменты для решения своих проблем с кодированием; скорее, они должны разузнать дефект в программе, просто прочитав ее. Как только программы становятся больше, чем страница длинная, это становится невозможным для людей. Отладчик - ваш лучший друг, поэтому ознакомьтесь с его функциями действительно хорошо.
В этом случае, если бы вы перешли через код в отладчике, вы увидите, что условие цикла анализируется, а затем цикл пропускается. В этот момент вы не будете спрашивать: «Почему это возвращает ноль?», Вы бы спросили: «Почему тело цикла всегда пропускается?» Понятно, что вопрос гораздо более продуктивный, потому что на самом деле проблема здесь.
Не записывайте код, не пропуская его в отладчике. Наблюдайте за каждой переменной, смотрите, как она меняет значение (отладчик выделяет переменные в окнах часов сразу после изменения значения, кстати) и убедитесь, что поток управления и переменная меняются точно так, как вы ожидали. Обратите внимание на тихие сомнения; если что-то кажется необычным, отследите его и узнайте, почему это правильно, или исправьте его до тех пор, пока он не появится.
Что касается актуальной проблемы: помните, что 15, 30, 45, 60 ... все кратные как три и пять, но вы только хотите, чтобы добавить их к сумме один раз. Мой совет при решении проблем Project Euler заключается в том, чтобы написать код, похожий на то, что вы пытаетесь решить, насколько это возможно. Попробуйте сначала написать проблему в «псевдокоде». Я бы назвал это псевдонимом как:
sum = 0
for each positive number under 1000:
if number is multiple of three or five then:
add number to sum
Как только у вас есть этот псевдокод, вы можете заметить его тонкости. Вроде, включительно 1000? Означает ли проблема «до 1000» или «до 1000»? Убедитесь, что это условие цикла. И так далее.
Чем ближе программа читается, тем лучше проблема, тем более вероятно, что она будет правильной.
WOW! Спасибо! Я думал, что если второй параметр был прав, цикл будет EXIT, а не продолжать работать. Код никогда не проверяет, что сумма фактически кратна, поскольку она убегает от логики, что если x * y = q, остаток q/x будет равен нулю. – sam
Yup, условие цикла должно возвращать true, чтобы цикл продолжался, а не наоборот;). Удачи вам в учебе, продолжайте. Эйлер - отличный сайт, я сам многое пережил сам (и «большинством из них» я имею в виду «все остальное было слишком тяжело для меня: D). –