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

В чем разница между этими кодами? (выполнение задачи Васильева А.Н. С++ Глава 2, задача 3)

11.06.2019, 15:12. Показов 862. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Решал задачу из учебника Васильвева А.Н. "Программирование на С++ в примерах и задачах, 2017":
Напишите такую программу: пользователем с клавиатуры вводится целое число, а программой отображаются все числа, на которое данное число делится без остатка.

Я собственно написал такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "pch.h"
#include <iostream>
#include <cstdlib>
 
int main()
{
    int a = 0, b = 1;
    std::cout << "Vvedite chislo: ";
    std::cin >> a;
    while (a % b == 0)
    {
        b++;
        std::cout << "Chislo na kotoroe delitsya bez ostatatka: " << b << std::endl;
    }
    std::system("pause");
    return 0;
}
Но ответы выходили неправильные.


И потом с помощью интернета такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "pch.h"
#include <iostream>
#include <cstdlib>
 
int main()
{
    int a = 0;
    std::cout << "Vvedite chislo: ";
    std::cin >> a;
    for (int b = 1; b <= a; b++)
    {
        if (a % b == 0)
        {
            std::cout << "Chislo na kotoroe delitsya bez ostatatka: " << b << std::endl;
        }
    }
    std::system("pause");
    return 0;
}

И каюсь, но я не могу никак понять какая принципиальная разница между двумя этими кодами.
Можете подсказать?

Добавлено через 4 минуты
А, пардон. Я кажется только что догадался.
C++
1
2
3
4
5
while (a % b == 0)
    {
        b++;
        std::cout << "Chislo na kotoroe delitsya bez ostatatka: " << b << std::endl;
    }
b++ ломает мне код? То есть с while никак не получится решить задачу?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.06.2019, 15:12
Ответы с готовыми решениями:

в чем разница между этими записями, и почему одна не работает
box2d, я написал вот так: world-&gt;Step(1 / 60, 8, 2); и физика не работала, не мог понять почему, потом просто скопировал вот этот код: ...

Какая разница между этими кодами?
&lt;p id=&quot;one&quot;&gt;Hello World&lt;/p&gt; &lt;div id=&quot;one&quot;&gt; &lt;p&gt;Hello World&lt;/p&gt; &lt;/div&gt;

В чем разница, между этими матрицами?
В общем, у меня сломалась матрица ноутбука. Я решил её заменить. Нашел в интернете б\у матрицу. Только её &quot;model&quot;, а именно...

11
Just Do It!
 Аватар для XLAT
4197 / 2652 / 654
Регистрация: 23.09.2014
Сообщений: 8,946
Записей в блоге: 3
11.06.2019, 15:20
MungenHara,
у вас цикл:
C++
10
11
12
while (a % b == 0)
{
    ...
выполняется до тех пор, пока условие (a % b == 0) будет true
что это значит:
пока делитель b делит без остатка.
Как только появляется остаток, то сразу выполнение вашей программы заканчивается,
т.е. если число a нечетное(например), то буде выведен только один результат:
Chislo na kotoroe delitsya bez ostatatka: 1

Добавлено через 2 минуты
Цитата Сообщение от MungenHara Посмотреть сообщение
То есть с while никак не получится решить задачу?
C++
1
2
3
4
5
6
7
...
while (b != a)
{
    b++;
    if(a % b == 0)
        std::cout << "Chislo na kotoroe delitsya bez ostatatka: " << b << std::endl;
}
1
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 56
11.06.2019, 15:20  [ТС]
XLAT, а! Теперь понял. Как-то даже не догадался. Глупая ошибка. Большое спасибо!
1
Just Do It!
 Аватар для XLAT
4197 / 2652 / 654
Регистрация: 23.09.2014
Сообщений: 8,946
Записей в блоге: 3
11.06.2019, 15:32
MungenHara, заметьте:
размывание цикла for(там где есть индексы) в цикл while есть гуано-стиль.

C++
1
2
3
4
5
6
7
8
int b = 1;     /// <<<-----|
while (b != a) /// <<<-----|
{   b++;       /// <<<-----| Все это с профитом для удобства чтение кода
               ///         | можно записать: for (int b = 1; b <= a; b++)
               
    if(a % b == 0)
        std::cout << "Chislo na kotoroe delitsya bez ostatatka: " << b << std::endl;
}
1
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
11.06.2019, 15:33
дополню, что делители по значению больше чем половина числа, нет смысла проверять, только добавить вывод самого числа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cstdlib>
 
int main()
{
    int a=0, b=1;
    std::cout << "Vvedite chislo: ";
    std::cin >> a;
   
    while (b<=a/2)
    {
        if (a % b == 0)
        {
            std::cout << "Chislo na kotoroe delitsya bez ostatatka: " << b << std::endl;
        }
        b++;
    }
    std::cout << "Chislo na kotoroe delitsya bez ostatatka: " << a << std::endl;
    std::system("pause");
    return 0;
}
1
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 56
11.06.2019, 15:40  [ТС]
XLAT, то есть в большинстве случаев лучше пользоваться for, если нет никакой прямой нужды в while, так как затрудняет чтение кода? Приму к сведению. Еще раз спасибо!

Добавлено через 5 минут
Yetty, я могу понять отчего нет нужды проверять делители больше половины самого числа. И к этому возник такой вопрос. Так ли важно указывать b<=a/2? Я так понимаю это облегчит производительность(не уверен в термине) кода?
1
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
11.06.2019, 15:43
Цитата Сообщение от MungenHara Посмотреть сообщение
лучше пользоваться for
Вы не так поняли речь о том, что любой цикл можно поменять на другой.
0
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 56
11.06.2019, 15:49  [ТС]
Цитата Сообщение от Yetty Посмотреть сообщение
Вы не так поняли речь о том, что любой цикл можно поменять на другой.
Да, наверное действительно я слишком радикально воспринял. В общем, главное всему своё место)
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
11.06.2019, 15:53
Цитата Сообщение от MungenHara Посмотреть сообщение
отчего нет нужды проверять делители больше половины самого числа
как бы понятнее объяснить там частное будет единичка с дробной частью (т.е. меньше чем 2). то есть среди них не будет делителей на которые число делится без остатка.
Цитата Сообщение от MungenHara Посмотреть сообщение
Так ли важно указывать b<=a/2? Я так понимаю это облегчит производительность
не очень важно, но нет смысла крутить циклы в которых происходят бесполезные вычисления - без них время выполнения программы будет меньше. особенно если числа большие стоит применять.
0
Just Do It!
 Аватар для XLAT
4197 / 2652 / 654
Регистрация: 23.09.2014
Сообщений: 8,946
Записей в блоге: 3
11.06.2019, 15:54
Цитата Сообщение от MungenHara Посмотреть сообщение
я слишком радикально воспринял
вот видете, насколько популярен гуано-стиль, что даже и не считается гуано
а вы правильно восприняли.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
11.06.2019, 16:09
XLAT, как то не задумывался про стили. сам как раз чаще применяю for. но всё равно, спасибо за инф.
1
2 / 2 / 0
Регистрация: 11.06.2019
Сообщений: 56
12.06.2019, 15:48  [ТС]
Цитата Сообщение от Yetty Посмотреть сообщение
не очень важно, но нет смысла крутить циклы в которых происходят бесполезные вычисления - без них время выполнения программы будет меньше. особенно если числа большие стоит применять.
А вот о больших цифрах как-то не задумался. Действительно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.06.2019, 15:48
Помогаю со студенческими работами здесь

В чем разница между этими объявлениями?
private: System::Windows::Forms::Label ^L2; и private: System::Windows::Forms::Label^ L2; если есть разница, могли бы мне ее...

В чем разница между этими массивами?
const char *names = {&quot;Ivanov&quot;, &quot;Petrov&quot;, &quot;Sidorov&quot;}; const char **names = {&quot;Ivanov&quot;, &quot;Petrov&quot;, &quot;Sidorov&quot;}; Добавлено через 8...

В чем разница между этими двумя HDD?
вот я не могу разобраться. подскажите, пожалуйста. 320 Gb Seagate, ST3320613AS, Barracuda 7200.11, SATA NCQ, 300 Mbytes/sec, 16 Mb,...

В чем разница между этими вариантами установки?
В чем разница?

В чем разница между этими двумя функциями?
int fp16_sign(fp16_t f) { int sign = 0; __asm( &quot;shl $1, %1;&quot; // CF = f &lt;&lt; 1; &quot;adc $0, %0&quot; // sign += CF; ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru