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

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

27.07.2015, 23:16. Показов 2054. Ответов 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,991
Записей в блоге: 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,991
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru