Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
rep plz
Заблокирован
1

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

29.07.2015, 19:25. Просмотров 364. Ответов 16
Метки нет (Все метки)

собственно сабж.
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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2015, 19:25
Ответы с готовыми решениями:

Можно ли написать более оптимальный код, используя цикл while?
собственно сабж. #include &lt;iostream&gt; using namespace std; int main() {...

Можно ли написать этот код более компактно?
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; void main() {...

как можно более просто написать эту программку(более понятным языком для начинающего)
7. Установить, четным или нечетным является число цифр в записи данного...

Необходимо преобразовать код в более простой - без функций, процедур и конструктора.
Всем доброго вечера. Долгое время работал над программой, в плане её понимания....

Изменить код, используя цикл
Помогите разобраться с циклом, Есть код, его надо изменить под циклический, как...

16
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
29.07.2015, 19:32 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;
}
Было бы что оптимизировать. Сумму нечётных чисел наверное можно и по формуле досчитать, без цикла.
0
rep plz
Заблокирован
29.07.2015, 19:38  [ТС] 3
Цитата Сообщение от castaway Посмотреть сообщение
Было бы что оптимизировать. Сумму нечётных чисел наверное можно и по формуле досчитать, без цикла.
мне важно знать что я делаю правильно, а что нет
0
Даценд
Модератор
Эксперт .NET
4149 / 3934 / 2605
Регистрация: 20.04.2015
Сообщений: 7,133
29.07.2015, 19:56 4
C++
1
2
3
4
for (count = 1; count < 99; count+=2)
{
     sum += count;
}
так в 2 раза меньше итераций
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
29.07.2015, 20:02 5
Цитата Сообщение от rep plz Посмотреть сообщение
мне важно знать что я делаю правильно, а что нет
Еще бы знать что именно ты хочешь сделать...
0
rep plz
Заблокирован
29.07.2015, 20:09  [ТС] 6
Цитата Сообщение от castaway Посмотреть сообщение
Еще бы знать что именно ты хочешь сделать...
используя цикл for посчитать сумму все нечетных чисел от 1 до 99

Добавлено через 39 секунд
Цитата Сообщение от Даценд Посмотреть сообщение
так в 2 раза меньше итераций
тогда он будет суммировать и четные числа. а мне нужны только нечетные
0
Даценд
Модератор
Эксперт .NET
4149 / 3934 / 2605
Регистрация: 20.04.2015
Сообщений: 7,133
29.07.2015, 20:11 7
Цитата Сообщение от rep plz Посмотреть сообщение
тогда он будет суммировать и четные числа
Только нечетные! Обратите внимание на модификацию count.
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
29.07.2015, 20:11 8
Цитата Сообщение от rep plz Посмотреть сообщение
тогда он будет суммировать и четные числа. а мне нужны только нечетные
Не будет.
0
shmkv
1199 / 421 / 59
Регистрация: 21.07.2015
Сообщений: 1,110
29.07.2015, 20:13 9
...
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
29.07.2015, 20:15 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, не стоит. А вот инициировать ли её в операции, или в декларации значения не имеет, так как инициируется она один раз, а сравнения и инкременты/декременты выполняются каждый раз.
0
rep plz
Заблокирован
29.07.2015, 20:16  [ТС] 11
Цитата Сообщение от shmkv Посмотреть сообщение
1 сточка. Кто меньше?
а где цикл for?
Цитата Сообщение от Даценд Посмотреть сообщение
Только нечетные! Обратите внимание на модификацию count.
я не знаком с такой модификацией..завтра поэкспериментирую, сейчас уже голова не варит
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
29.07.2015, 20:18 12
Цитата Сообщение от Даценд Посмотреть сообщение
for (count = 1; count < 99; count+=2)
{
sum += count;
}
так в 2 раза меньше итераций
Да, для констант так ещё лучше, хотя увеличение на 2 потенциально и медленнее. Но не весь же шаг цикла в два раза.

Добавлено через 40 секунд
Цитата Сообщение от rep plz Посмотреть сообщение
тогда он будет суммировать и четные числа. а мне нужны только нечетные
Нет. Нечётное плюс два равно нечётное.
0
Даценд
Модератор
Эксперт .NET
4149 / 3934 / 2605
Регистрация: 20.04.2015
Сообщений: 7,133
29.07.2015, 20:23 13
Цитата Сообщение от taras atavin Посмотреть сообщение
хотя увеличение на 2 потенциально и медленнее
зато нет проверки четности
0
shmkv
1199 / 421 / 59
Регистрация: 21.07.2015
Сообщений: 1,110
29.07.2015, 20:27 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 нулем перед циклом не инициализируется.
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
29.07.2015, 20:28 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.
0
shmkv
1199 / 421 / 59
Регистрация: 21.07.2015
Сообщений: 1,110
29.07.2015, 20:34 16
Цитата Сообщение от rep plz Посмотреть сообщение
а где цикл for?
ну на for:
C++
1
for(sum = 0, count = 1; count < 10; sum+=count, count+=2);
Добавлено через 3 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
Обратите внимание
Да я поправил. Не обязательно мне было так расписывать все. Кстати тут не n, а n /2 получается.
0
taras atavin
4204 / 1765 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
29.07.2015, 20:36 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.
0
29.07.2015, 20:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2015, 20:36

Переписать код, используя другой цикл
Перепишите, пожалуйста, код, используя только цикл &quot;While&quot; int N=100; cout...

Можно ли инициализировать динамический массив не используя цикл?
Когда создавали статический массив, можно было сделать так: int...

Можно ли сделать бесконечный цикл с while, используя тип bool?
... bool f; f=false; while(f=false) { ... ... ... if(....)//какое-то...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru