#c #if-statement
#c #if-оператор
Вопрос:
Я решаю первую задачу project euler, и я только что сделал это
#include <iostream>
using namespace std;
int main(){
int threes =0;
int fives = 0;
int both = 0;
for (int i = 0; i < 10; i ){
if(i%3==0){
threes = i;
}
if(i%5==0){
fives = i;
}
if ( i % 5 == 0 amp;amp; i % 3 == 0){
both = i;
}
}
cout << "threes = " << threes << endl;
cout << "fives = " << fives << endl;
cout << "both = " << both << endl;
cout << " threes fives - both = " << endl;
int result = (threes fives) - both;
cout << result<< endl;
return 0;
}
Мой профессор недавно поправил меня за то, что я делал это в другой задаче, сказав что-то о else
заявлениях,
но я не понимаю, ПОЧЕМУ я должен добавлять else
перед следующим if
. как бы то ни было, у меня есть другая версия с else if(i%5){ fives = .... }
и они оба работают и дают мне правильный ответ.
Мой вопрос в том, что изначально неправильно в этом способе мышления, это стилистическое или я о чем-то не думаю логически?
Если это работает, зачем вообще использовать операторы switch?
Комментарии:
1. Исходя из вопроса: бьюсь об заклад, что вы не должны увеличивать,
both
если вы также увеличиваетеthree
иfive
. т. е. каждый раз, когда в цикле требуется увеличивать только одну переменную.
Ответ №1:
Единственное, что я вижу неправильного в вашей реализации, это то, что в случае, когда число одновременно кратно 3 и кратно 5, увеличиваются не только обе переменные, но также переменные fives и threes. Основываясь на том, что описал профессор, я полагаю, что он хочет, чтобы вы использовали else-if, чтобы переменная both была единственной, которая увеличивается при передаче числа, кратного как 3, так и 5.
Причина, по которой вы получаете правильный ответ обоими способами, заключается в том, что в цикле for вы получаете только 10, если вы увеличите его до i <= 15, вы получите пятерки и тройки на 1 больше, чем, я думаю, он предполагал.
Например:
for( int i = 0; i < 10; i )
{
if( ( ( i % 3 ) == 0 ) amp;amp; ( ( i % 5 ) == 0 ) )
{
both ;
}
else if( ( i % 3 ) == 0 )
{
threes ;
}
else if( ( i % 5 ) == 0 )
{
fives ;
}
}
Комментарии:
1. комментарий профессора, который я сделал, был для другой проблемы. На самом деле мне вообще не нужна переменная both. Моя окончательная реализация — if (i% 3 == 0){ threes = i; } else if (i % 5 == 0) { fives = i; } Мне не нужны оба, потому что число, подобное 15, будет истинным для части 3 и, таким образом, пропустит оператор 5, поэтому все числа подсчитываются только один раз. это странно, потому что у меня было три идеи / реализации, и все они дали мне правильный ответ…
Ответ №2:
else
Ветвь в if-else
инструкции выполняется только в том случае, если if
ветвь является false
. Если у вас есть только два if
оператора подряд, они оба будут выполнены, что может оказаться пустой тратой времени. В приведенном ниже коде else
предотвращает выполнение второго вычисления, если выполнено первое.
if (expensive_computation1()) {
...
}
else if (expensive_computation2()) {
...
}
Кроме того, людям, читающим код, становится понятнее, следует ли разрешать выполнение обоих if
операторов или только одного.
Ответ №3:
В этом случае, возможно, вы действительно хотите этого:
if (i % 5 == 0 amp;amp; i % 3 == 0) {
both = i;
} else if (i % 3 == 0) {
threes = i;
} else if (i % 5 == 0) {
fives = i;
}
(почему вы делаете = i
вместо
, я не знаю, но вы не объяснили, поэтому я просто скопировал это)
В вашем коде threes
и fives
были увеличены, даже если они также увеличились бы both
, что в зависимости от вашей проблемы может быть не тем, что вы хотите. Если вы выполняете только что представленный мной способ if / else, увеличивается только одна из трех переменных.
Комментарии:
1. первоначальный вопрос был: «Найдите сумму всех чисел, кратных 3 или 5, меньше 1000». Я хочу сложить числа, а не отслеживать, сколько их существует, поэтому сделал = . На самом деле я избавился от обеих идей. в этом не было необходимости. тем не менее, спасибо, что каждый ответ помог
Ответ №4:
Зачем использовать if-else
вместо multiple if's
?
if-else
amp; if
достигло бы тех же результатов, но if-else
достигло бы их способом, повышающим производительность. при использовании нескольких if's
каждое условие if должно быть проверено. С if-else
потребуется выполнить только одну условную проверку, а остальные условия просто не нужно проверять вообще.
Это не повлияло бы на небольшую программу, подобную той, что у вас есть, но это, несомненно, окажет некоторое влияние на потенциально дорогостоящую функцию, вызываемую многократно снова и снова.
Если это работает, зачем вообще использовать операторы switch?
С вложенными if-else
условиями код трудно читать и понимать. switch-case
Конструкция помогает представить условия в гораздо более удобном для чтения и понимания формате.
Ответ №5:
Для меня это выглядит как стилистика. Вы можете использовать какой-нибудь инструмент автоматического форматирования, который соответствует определенному установленному стилистическому виду (K amp; R, ANSI, GNU и т.д.)
Например, astyle является таким инструментом,http://astyle.sourceforge.net / — просто переформатируйте свой код с его помощью, и у вас может быть счастливый профессор.