Форум программистов, компьютерный форум CyberForum.ru

Можно ли написать более оптимальный или простой код, используя цикл for? - C++

Восстановить пароль Регистрация
 
rep plz
Заблокирован
29.07.2015, 19:25     Можно ли написать более оптимальный или простой код, используя цикл for? #1
собственно сабж.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
 
using namespace std;
 
int main()
{
    int sum, count, ost;
 
    for (count = 0; count < 99; count++)
    {
        ost = count % 2;
 
        if (ost != 0)
        {
            sum += count;
        }
 
        else
        {
            continue;
        }
 
    }
 
    cout << "summa = " << sum;
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2015, 19:25     Можно ли написать более оптимальный или простой код, используя цикл for?
Посмотрите здесь:

как можно более просто написать эту программку(более понятным языком для начинающего) C++
C++ написать программу, которая выводит на экран оценку при введении количества баллов не используя цикл
C++ Какой вариант более оптимальный?
Написать, используя цикл for, ввод с клавиатуры 10 чисел C++
Как можно записать код в более компактном виде? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
29.07.2015, 19:32     Можно ли написать более оптимальный или простой код, используя цикл for? #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
using namespace std;
 
int main()
{
    int sum, count, ost;
 
    for (count = 0; count < 99; count++)
    {
        ost = count % 2;
        if ( ost ) sum += count;
    }
 
    cout << "summa = " << sum;
 
    return 0;
}
Было бы что оптимизировать. Сумму нечётных чисел наверное можно и по формуле досчитать, без цикла.
rep plz
Заблокирован
29.07.2015, 19:38  [ТС]     Можно ли написать более оптимальный или простой код, используя цикл for? #3
Цитата Сообщение от castaway Посмотреть сообщение
Было бы что оптимизировать. Сумму нечётных чисел наверное можно и по формуле досчитать, без цикла.
мне важно знать что я делаю правильно, а что нет
Даценд
Модератор
 Аватар для Даценд
2494 / 2409 / 1234
Регистрация: 20.04.2015
Сообщений: 4,597
29.07.2015, 19:56     Можно ли написать более оптимальный или простой код, используя цикл for? #4
C++
1
2
3
4
for (count = 1; count < 99; count+=2)
{
     sum += count;
}
так в 2 раза меньше итераций
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
29.07.2015, 20:02     Можно ли написать более оптимальный или простой код, используя цикл for? #5
Цитата Сообщение от rep plz Посмотреть сообщение
мне важно знать что я делаю правильно, а что нет
Еще бы знать что именно ты хочешь сделать...
rep plz
Заблокирован
29.07.2015, 20:09  [ТС]     Можно ли написать более оптимальный или простой код, используя цикл for? #6
Цитата Сообщение от castaway Посмотреть сообщение
Еще бы знать что именно ты хочешь сделать...
используя цикл for посчитать сумму все нечетных чисел от 1 до 99

Добавлено через 39 секунд
Цитата Сообщение от Даценд Посмотреть сообщение
так в 2 раза меньше итераций
тогда он будет суммировать и четные числа. а мне нужны только нечетные
Даценд
Модератор
 Аватар для Даценд
2494 / 2409 / 1234
Регистрация: 20.04.2015
Сообщений: 4,597
29.07.2015, 20:11     Можно ли написать более оптимальный или простой код, используя цикл for? #7
Цитата Сообщение от rep plz Посмотреть сообщение
тогда он будет суммировать и четные числа
Только нечетные! Обратите внимание на модификацию count.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
29.07.2015, 20:11     Можно ли написать более оптимальный или простой код, используя цикл for? #8
Цитата Сообщение от rep plz Посмотреть сообщение
тогда он будет суммировать и четные числа. а мне нужны только нечетные
Не будет.
shmkv
538 / 252 / 28
Регистрация: 21.07.2015
Сообщений: 748
29.07.2015, 20:13     Можно ли написать более оптимальный или простой код, используя цикл for? #9
...
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.07.2015, 20:15     Можно ли написать более оптимальный или простой код, используя цикл for? #10
1.
Цитата Сообщение от rep plz Посмотреть сообщение
C++
1
2
3
{
 continue;
}
здесь не нужно, так как оно завершает тело цикла. Можно просто завершить тело цикла сразу после
Цитата Сообщение от rep plz Посмотреть сообщение
C++
1
2
3
4
if (ost != 0)
{
 sum += count;
}
.
2. Зачем нужна переменная ost? Скормить оператору сравнения можно и временную величину, а больше ost ни где не учитывается. Возможно это и не помешает автоматической оптимизациям, но я бы убрал:
C++
1
2
3
4
if ((count % 2)==0)
{
 sum += count;
}
.
3. Постфиксный инкремент оптимизируется только до префиксного, префиксный уже оптимален. Поэтому не
Цитата Сообщение от rep plz Посмотреть сообщение
C++
1
for (count = 0; count < 99; count++)
, а
C++
1
for (count = 0; count < 99; ++count)
.
4. Сравнение с любым не нулевым числом бывает медленнее, чем с нолём, так как требует . Поэтому ещё лучше
C++
1
for (count = 98; count >=0; --count)
. Но только если можно не в ущерб разрядности юзать только знаковый счётчик. Если диапазона представимых значений знакового типа не хватает, то для такого похода придётся поднимать разрядность, если в итоге превысить разрядность шины, то инкремент/декремент можно замедлить. А если превысить разрядность даже регистра, то инкремент/декремент будут гарантированно замедленны. Тогда придётся всё таки сравнивать с количеством шагов цикла. Если порядок значений счётчика важен сам по себе, то менять инкремент на декремент нельзя. Но здесь не важен.
5. По стандарту явно не инициированная переменная или содержит мусор, или инициируется своим конструктором. Так что полагаться на то, что в sum до первого увеличения будет 0, не стоит. А вот инициировать ли её в операции, или в декларации значения не имеет, так как инициируется она один раз, а сравнения и инкременты/декременты выполняются каждый раз.
rep plz
Заблокирован
29.07.2015, 20:16  [ТС]     Можно ли написать более оптимальный или простой код, используя цикл for? #11
Цитата Сообщение от shmkv Посмотреть сообщение
1 сточка. Кто меньше?
а где цикл for?
Цитата Сообщение от Даценд Посмотреть сообщение
Только нечетные! Обратите внимание на модификацию count.
я не знаком с такой модификацией..завтра поэкспериментирую, сейчас уже голова не варит
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.07.2015, 20:18     Можно ли написать более оптимальный или простой код, используя цикл for? #12
Цитата Сообщение от Даценд Посмотреть сообщение
for (count = 1; count < 99; count+=2)
{
sum += count;
}
так в 2 раза меньше итераций
Да, для констант так ещё лучше, хотя увеличение на 2 потенциально и медленнее. Но не весь же шаг цикла в два раза.

Добавлено через 40 секунд
Цитата Сообщение от rep plz Посмотреть сообщение
тогда он будет суммировать и четные числа. а мне нужны только нечетные
Нет. Нечётное плюс два равно нечётное.
Даценд
Модератор
 Аватар для Даценд
2494 / 2409 / 1234
Регистрация: 20.04.2015
Сообщений: 4,597
29.07.2015, 20:23     Можно ли написать более оптимальный или простой код, используя цикл for? #13
Цитата Сообщение от taras atavin Посмотреть сообщение
хотя увеличение на 2 потенциально и медленнее
зато нет проверки четности
shmkv
538 / 252 / 28
Регистрация: 21.07.2015
Сообщений: 748
29.07.2015, 20:27     Можно ли написать более оптимальный или простой код, используя цикл for? #14
а тут нечетные, тогда еще проще:
C++
1
2
3
const int n = 99;
const int n_2 = n / 2;
sum = n_2 * n_2;
1 сточка вычислений.

Добавлено через 1 минуту
rep plz, у тебя кстати sum нулем перед циклом не инициализируется.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.07.2015, 20:28     Можно ли написать более оптимальный или простой код, используя цикл for? #15
Цитата Сообщение от shmkv Посмотреть сообщение
2
const int n = 99;
sum = n * (n + 1);
1 сточка. Кто меньше?
1. На примере данной задачи он изучает программирование, а не математику, а если говорить именно о программном решении, то ты решил даже если и эквивалентную, то всё таки другую задачу - задачу вычисления по формуле, а не вычисление суммы чисел.
2. 99*100=9900, а 1+3+5+7+9+11+13+15+17+19+21+23+25+27+29+31+33+35+37+41+43+45+47+49+51+53+55+57+59+61+63+65+67+69+71+73+75+79+81+83+85+87+89+91+93+95+97+99=2500. Обратите внимание: 2.1. Нужна сумма только нечётных чисел от 1 до 99, а их не 99, а 50.
2.2. По формуле http://www.cyberforum.ru/cgi-bin/latex.cgi?s=\frac{a_1+a_n}{2}*n, а не http://www.cyberforum.ru/cgi-bin/latex.cgi?s=(a_1+a_n)*n.
shmkv
538 / 252 / 28
Регистрация: 21.07.2015
Сообщений: 748
29.07.2015, 20:34     Можно ли написать более оптимальный или простой код, используя цикл for? #16
Цитата Сообщение от rep plz Посмотреть сообщение
а где цикл for?
ну на for:
C++
1
for(sum = 0, count = 1; count < 10; sum+=count, count+=2);
Добавлено через 3 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
Обратите внимание
Да я поправил. Не обязательно мне было так расписывать все. Кстати тут не n, а n /2 получается.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2015, 20:36     Можно ли написать более оптимальный или простой код, используя цикл for?
Еще ссылки по теме:

Можно ли инициализировать динамический массив не используя цикл? C++
Можно ли написать этот код более компактно? C++
Можно ли написать более оптимальный код, используя цикл while? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.07.2015, 20:36     Можно ли написать более оптимальный или простой код, используя цикл for? #17
Кстати, до 99 включительно, то <=99, а не <99.
С декрементом и половиной иттераций
C++
1
for (count=97; count>0; count-=2)
, а если включая 99, то
C++
1
for (count=99; count>0; count-=2)
, а со всеми иттерациями и включая 99 с декрементом будет
C++
1
for (count=99; count>0; --count)
.

Добавлено через 1 минуту
Цитата Сообщение от shmkv Посмотреть сообщение
Не обязательно мне было так расписывать все. Кстати тут не n, а n /2 получается.
Справочная формула - полусумма на всю n.
Yandex
Объявления
29.07.2015, 20:36     Можно ли написать более оптимальный или простой код, используя цикл for?
Ответ Создать тему
Опции темы

Текущее время: 07:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru