Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
rep plz
Заблокирован
#1

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

29.07.2015, 19:25. Просмотров 331. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можно ли написать более оптимальный или простой код, используя цикл for? (C++):

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

Можно ли написать этот код более компактно? - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; void main() { int x, y; cout &lt;&lt; &quot;input x = &quot;; cin &gt;&gt; x; cout...

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

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

Изменить код, используя цикл - C++
Помогите разобраться с циклом, Есть код, его надо изменить под циклический, как сделать х3, помогите пожалуйста. #include &quot;stdafx.h&quot; ...

Можно ли инициализировать динамический массив не используя цикл? - C++
Когда создавали статический массив, можно было сделать так: int array={1,5,14,23,32,45,67}; Можно ли такое же сделать с динамическим...

16
castaway
Эксперт С++
4919 / 3027 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 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
3563 / 3484 / 1786
Регистрация: 20.04.2015
Сообщений: 6,401
29.07.2015, 19:56 #4
C++
1
2
3
4
for (count = 1; count < 99; count+=2)
{
     sum += count;
}
так в 2 раза меньше итераций
0
castaway
Эксперт С++
4919 / 3027 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 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
3563 / 3484 / 1786
Регистрация: 20.04.2015
Сообщений: 6,401
29.07.2015, 20:11 #7
Цитата Сообщение от rep plz Посмотреть сообщение
тогда он будет суммировать и четные числа
Только нечетные! Обратите внимание на модификацию count.
0
castaway
Эксперт С++
4919 / 3027 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
29.07.2015, 20:11 #8
Цитата Сообщение от rep plz Посмотреть сообщение
тогда он будет суммировать и четные числа. а мне нужны только нечетные
Не будет.
0
shmkv
624 / 339 / 43
Регистрация: 21.07.2015
Сообщений: 995
29.07.2015, 20:13 #9
...
0
taras atavin
3571 / 1755 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
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
3571 / 1755 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
29.07.2015, 20:18 #12
Цитата Сообщение от Даценд Посмотреть сообщение
for (count = 1; count < 99; count+=2)
{
sum += count;
}
так в 2 раза меньше итераций
Да, для констант так ещё лучше, хотя увеличение на 2 потенциально и медленнее. Но не весь же шаг цикла в два раза.

Добавлено через 40 секунд
Цитата Сообщение от rep plz Посмотреть сообщение
тогда он будет суммировать и четные числа. а мне нужны только нечетные
Нет. Нечётное плюс два равно нечётное.
0
Даценд
Модератор
Эксперт .NET
3563 / 3484 / 1786
Регистрация: 20.04.2015
Сообщений: 6,401
29.07.2015, 20:23 #13
Цитата Сообщение от taras atavin Посмотреть сообщение
хотя увеличение на 2 потенциально и медленнее
зато нет проверки четности
0
shmkv
624 / 339 / 43
Регистрация: 21.07.2015
Сообщений: 995
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
3571 / 1755 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
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
29.07.2015, 20:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2015, 20:28
Привет! Вот еще темы с ответами:

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

Есть ли более простой и оптимальный способ решения данной задачи? - C#
Добрый день! Ситуация следующая: Есть класс Event. public class Event { public string Name { get; set; } public...

Используя цикл for, while или repeat(какой быстрее и удобнее) написать программу - Алгоритмы
Используя цикл for, while или repeat(какой быстрее и удобнее) написать программу Начав тренировки, спортсмен в первый день пробежал 10...

Используя цикл for, while или repeat(какой быстрее и удобнее) написать программу - Turbo Pascal
Начав тренировки, спортсмен в первый день пробежал 10 км. Каждый день он увеличивал дневную норму на 10% нормы предыдущего дня. Какой...


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

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

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