С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Заблокирован

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

27.07.2015, 23:16. Показов 2004. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
собственно сабж.
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
29
30
31
32
#include <iostream>
 
using namespace std;
 
int main()
{
    int x, y, s, step = 1;
 
    cout << "Vvedite x" << endl;
    cin >> x;
    cout << "Vvedite y" << endl;
    cin >> y;
 
    if (y == 0)
    {
        cout << "S ravno 0" << endl;
    }
 
 
    if (y >= 1)
    {
        s = x;
        while (step < y )
        {
        s *= x;
        step ++;
        }
    cout << "x v stepeni y = " << s;
    }
 
    return 0;
}
если есть более простые варианты, хотелось бы их увидеть
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.07.2015, 23:16
Ответы с готовыми решениями:

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

Можно ли написать этот код более компактно?
#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...

Может ли человек порождать более оптимальный pure javaScript-код, чем TypeScript?
Доброе утро! Можем ли мы вручную порождать более оптимальный и красивый код, нежели TypeScript? Заранее благодарен за отклики.

29
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
27.07.2015, 23:33
rep plz, хотелось бы увидеть постановку задачи. Впрочем, по приведенному коду она легко восстанавливается. Надо возвести x в степень y. Так?
У вас ошибочка. По всем законам математики x0 = 1
А код может выглядеть так.
C++
1
for(s=1, step=0; step<y; step++) s *= x;
Это вместо строк 14-27

Добавлено через 4 минуты
Если надо непременно использовать while, а не for, следует заметить, что любой for-цикл можно преобразовать в while-цикл (и наоборот). Просто в данном случае добавится несколько строчек.
0
Заблокирован
27.07.2015, 23:33  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
rep plz, хотелось бы увидеть постановку задачи. Впрочем, по приведенному коду она легко восстанавливается. Надо возвести x в степень y. Так?
У вас ошибочка. По всем законам математики x0 = 1
А код может выглядеть так.
Код C++Выделить код
1
for(s=1, step=0; step<y; step++) s *= x;
Это вместо строк 14-27
ну ладно, подзабыл математику
а цикл for использовать нельзя. обязательно while
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
27.07.2015, 23:33
Если надо непременно использовать while, а не for, следует заметить, что любой for-цикл можно преобразовать в while-цикл (и наоборот). Просто в данном случае добавится несколько строчек.
0
Заблокирован
27.07.2015, 23:38  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
Если надо непременно использовать while, а не for, следует заметить, что любой for-цикл можно преобразовать в while-цикл (и наоборот). Просто в данном случае добавится несколько строчек.
т.е. ответ на мой вопрос - можно?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
27.07.2015, 23:40
Цитата Сообщение от rep plz Посмотреть сообщение
подзабыл математику
Для программиста это совершенно не допустимо.
Цитата Сообщение от rep plz Посмотреть сообщение
а цикл for использовать нельзя. обязательно while
C++
1
2
3
4
5
6
s=1;
step = 0;
while(step < y) {
  s *= x;
  step++;
}
Рекомендую в качестве полезного упражнения на досуге преобразовать несколько for-циклов в while (и наоборот)
Уверяю вас, потраченное время в дальнейшем окупится с лихвой.
1
Заблокирован
27.07.2015, 23:49  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
Рекомендую в качестве полезного упражнения на досуге преобразовать несколько for-циклов в while (и наоборот)
Уверяю вас, потраченное время в дальнейшем окупится с лихвой.
спасибо. обязательно попробую. пока подумаю почему s = 1
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,989
Записей в блоге: 32
27.07.2015, 23:57
Цитата Сообщение от rep plz Посмотреть сообщение
пока подумаю почему s = 1
Потому что нейтральный элемент требуемого моноида, естественно
0
Заблокирован
28.07.2015, 00:16  [ТС]
Цитата Сообщение от _Ivana Посмотреть сообщение
Потому что нейтральный элемент требуемого моноида, естественно
так бы сразу и сказали что моноида требует. это многое объясняет
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,989
Записей в блоге: 32
28.07.2015, 00:24
Если бы уважаемый Байт вам сказал такое сразу, это могло бы вас смутить, поэтому он начал издалека. Но как только вы изъявили желание "подумать, почему" (С) - пришло время сказать правду
2
Заблокирован
28.07.2015, 00:42  [ТС]
Цитата Сообщение от _Ivana Посмотреть сообщение
Если бы уважаемый Байт вам сказал такое сразу, это могло бы вас смутить, поэтому он начал издалека. Но как только вы изъявили желание "подумать, почему" (С) - пришло время сказать правду
да я бы и сам догадался не хотел просто лишать смысла ваш уважаемый пост под двусмысленным номером 8

Добавлено через 11 минут
Цитата Сообщение от Байт Посмотреть сообщение
1
for(s=1, step=0; step<y; step++) s *= x;
в этом случае приходится объявлять s дважды. в условии цикла и в майне
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
28.07.2015, 00:43
Цитата Сообщение от rep plz Посмотреть сообщение
объявлять s дважды
единожды в мэйне перед циклом.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.07.2015, 05:38
Ну, если гоняться именно за оптимальностью (а не простотой):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
#include<cmath>
using namespace std;
 
int main()
{
    double x;//что возводится в степень
    int n;//в какую степень
    cin>>x>>n;
    double res=1,exp=x;
    for(int i=1;i<=n;i<<=1,exp*=exp)
        if(n&i)
            res*=exp;
    cout<<res<<" "<<pow(x,n)<<endl;
    return 0;
}
1
Заблокирован
28.07.2015, 07:21  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Ну, если гоняться именно за оптимальностью (а не простотой):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
* * double x;//что возводится в степень
* * int n;//в какую степень
* * cin>>x>>n;
* * double res=1,exp=x;
* * for(int i=1;i<=n;i<<=1,exp*=exp)
* * * * if(n&i)
* * * * * * res*=exp;
* * cout<<res<<" "<<pow(x,n)<<endl;
* * return 0;
}
стоп. а где цикл while?

Добавлено через 1 минуту
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
единожды в мэйне перед циклом.
и действительно
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
28.07.2015, 07:22
Цитата Сообщение от rep plz Посмотреть сообщение
s = x; while (step < y ) { s *= x; step ++; }
Именно с вайлом лучше уже не сделаешь, потому что здесь лучше подойдёт for.
0
Заблокирован
28.07.2015, 07:25  [ТС]
Цитата Сообщение от taras atavin Посмотреть сообщение
Именно с вайлом лучше уже не сделаешь, потому что здесь лучше подойдёт for
это самые приятные слова, которые мне говорили за последние 15 минут
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
28.07.2015, 22:56

Не по теме:

Цитата Сообщение от _Ivana Посмотреть сообщение
Потому что нейтральный элемент требуемого моноида
До чего приятно услышать умные слова!:) Я, правда, грешным делом, считал множество положительных целых чисел полугруппой с единицей по умножению, но ни дела, ни удовольствия, это не меняет:)

Цитата Сообщение от Renji Посмотреть сообщение
если гоняться именно за оптимальностью

Однако, имхо, можно и еще оптимальнее, воспользовавшись чем-то вроде дихотомической рекурсии. Соответствующие коды приводились уже на форуме неоднократно, в том числе и вашим покорным слугой.
0
28.07.2015, 23:00

Не по теме:

Цитата Сообщение от Байт Посмотреть сообщение
Я, правда, грешным делом, считал множество положительных целых чисел полугруппой с единицей по умножению
Вы просто используете другие слова :)
https://ru.wikipedia.org/wiki/... 0%BF%D0%B0
https://ru.wikipedia.org/wiki/... 0%B8%D0%B4

0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
28.07.2015, 23:03
А если кому рекурсия не по вкусу, то опять же любой рекурсивный алгоритм можно реализовать в виде итерационного и наоборот. Правда, это упражнение уже посложнее чем for - while. И, конечно, интереснее.

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от _Ivana Посмотреть сообщение
Вы просто используете другие слова
Слов много, истина - одна. Не правда ли?

0
28.07.2015, 23:09

Не по теме:

Байт, правда. Зря вы от хаскеля отвернулись - там подобная красота на каждом шагу, начиная с библиотечных абстракций :) Например, произведение элементов коллекции вычисляется через свертку по вышеупомянутому моноиду

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.07.2015, 23:09
Помогаю со студенческими работами здесь

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

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

Оптимизировать код, используя цикл
k = -a(1, 1) / a(2, 1) For i = 1 To 3 a(2, i) = a(2, i) * k + a(1, i) Next i b(2) = b(2) * k...

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru