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

Не понятен смысл кода вывода простых чисел

11.04.2015, 21:43. Показов 841. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет, совсем недавно начал изучать С++, читаю книгу, да и до этого как-то были аленькие опыты, так вот, есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <clocale>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "RUS");
    int i, j;
    for (i = 2; i < 1000; i++)
    {
        for (j = 2; j <= (i / j); j++)
            if (!(i%j)) break;
            if(j>(i/j)) cout << i << endl;
    }
    system("pause");
    return 0;
}
Он выводи все простые числа в диапазоне от 2 до 1000, так написано в книге, он действительно это делает. Но я что-то не могу уловить сути, а именно эту часть. Как-то не до конца понимаю, как это работает. Поможете объяснить?
C++
1
2
3
4
5
6
for (i = 2; i < 1000; i++)
    {
        for (j = 2; j <= (i / j); j++)
            if (!(i%j)) break;
            if(j>(i/j)) cout << i << endl;
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2015, 21:43
Ответы с готовыми решениями:

Не понятен смысл строки кода
Необходимо разобраться в чужом коде (примере, предоставленном разработчиками оборудования). В...

Рефакторинг кода вывода простых чисел
#include &lt;iostream&gt; #include &lt;ctime&gt; int main() { clock_t t = clock(); { ...

Не понятен смысл задания по C#
Разработать класс «Квадрат» . Определить в нем конструкторы и деструктор, перегрузить операцию...

Не понятен смысл задания
Ребят, глупый вопрос, но не могу понять. Вот есть задание: Найти производную dy/dx исходя из...

17
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
11.04.2015, 21:57 2
Напишите название книги, в которой приведен этот образец гениальности - делить на 4, 6 и т.д. если не поделилось на 2.
0
5 / 5 / 4
Регистрация: 31.03.2015
Сообщений: 48
11.04.2015, 21:58 3
Он выводит не все числа от 2 до 1000. А лишь ту часть, которая подходит под условия.
C++
1
2
3
4
5
6
for (i = 2; i < 1000; i++)
    {
        for (j = 2; j <= (i / j); j++)
            if (!(i%j)) break;
            if(j>(i/j)) cout << i << endl;
    }
0
0 / 0 / 1
Регистрация: 11.04.2015
Сообщений: 31
11.04.2015, 22:18  [ТС] 4
Цитата Сообщение от _Ivana Посмотреть сообщение
Напишите название книги, в которой приведен этот образец гениальности - делить на 4, 6 и т.д. если не поделилось на 2.
Герберт Шилдт C++ базовый курс 3-е издание

Добавлено через 11 минут
Цитата Сообщение от Otello Посмотреть сообщение
Он выводит не все числа от 2 до 1000. А лишь ту часть, которая подходит под условия.
C++
1
2
3
4
5
6
for (i = 2; i < 1000; i++)
    {
        for (j = 2; j <= (i / j); j++)
            if (!(i%j)) break;
            if(j>(i/j)) cout << i << endl;
    }
Я сейчас просто распишу, как я рассуждаю:
i=2 оно <1000, поэтому входит в цикл, j=2 и j<=(i/j), то есть 2<=2/2 --> 2<=1, то есть не подходит, значит первое if не выполняется, переходим ко второму if, где 2>2/2 --> 2>1, что верно, поэтому первым простым числом является 2. i=2+1=3, j=2+1=3. Все начинается опять с первого for. i=3<1000, входит, j=3<=3/3, что опять неверно, идем во второй if, 3>3/3, да, подходит. i=3+1=4, j=3+1=4. У нас уже два числа: 2 и 3. Сначала, i=4<1000, j=4<=4/4, не подходит, идем во второй if, 4>4/4, да. подходит, то есть 2, 3 и 4, но 4 не является простым, это я так думаю, как все это происходит, но нет, при выводе там получаются только простые числа, 2, 3, 5 и т.д. Возможно я чего-то не понимаю, но чего? Насколько я понимаю, первый if исполнялся бы только если условие второго for было истиной, но, когда я считаю получается всегда ложь и первое if никогда не выполняется. Вроде до этого, как-то разбирался в if и for, до этого момента...
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
11.04.2015, 22:21 5
Цитата Сообщение от _Ivana Посмотреть сообщение
образец гениальности
Минимум упрощений, вариант "в лоб" - цикл от 2 до i. Следуя же вашему замыслу, проверок будет куда больше - на 3, на 5, на 7 и т.д. В общем, на все простые числа от 2 до i включительно. А затем проверять, а делится ли i на то самое простое число. Ну или наоборот, сначала проверить, делится ли i на простое число, а затем проверить, делится ли шаг на простое число. Перефразирую: а оно надо в книге для новичков?
0
5 / 5 / 4
Регистрация: 31.03.2015
Сообщений: 48
11.04.2015, 22:22 6
Ошибочка. Во втором пункте j равно 2, потому что цикл 2 запущен заново, значит сначала j=2; 2<=3/2...
0
0 / 0 / 1
Регистрация: 11.04.2015
Сообщений: 31
11.04.2015, 22:30  [ТС] 7
Цитата Сообщение от Otello Посмотреть сообщение
Ошибочка. Во втором пункте j равно 2, потому что цикл 2 запущен заново, значит сначала j=2; 2<=3/2...
Хм... А зачем тогда j++?
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
11.04.2015, 22:33 8
KOPOJI, мне просто стало любопытно, в какой такой книге пишется подобная чушь. И что эти книги еще и читают и по ним пытаются учиться.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
11.04.2015, 22:37 9
want_my_dream, простое число - число, которое делится только на само себя и на единицу. Поэтому вложенный цикл проверяет все числа от 2 до текущего числа, чтобы узнать, делится i на еще какое-то число из диапазона [2, i)

Добавлено через 1 минуту
_Ivana, это же не книга по алгоритмизации.. Имхо, вполне нормально дать такой вариант (а если дальше еще есть и сноска на то, что код неоптимизированный или оптимизации в качестве задания - то и вообще отлично).
0
5 / 5 / 4
Регистрация: 31.03.2015
Сообщений: 48
11.04.2015, 22:40 10
Прочитай как работает for и ещё раз подумай.
0
KOPOJI
11.04.2015, 22:42
  #11

Не по теме:

Otello, хорошо, прочитаю, подумаю..

0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
11.04.2015, 22:44 12
Цитата Сообщение от KOPOJI Посмотреть сообщение
от 2 до текущего числа
справедливости ради - до корня. На это авторов все-таки хватило.
0
KOPOJI
11.04.2015, 22:48
  #13

Не по теме:

Цитата Сообщение от _Ivana Посмотреть сообщение
до корня
да, не до текущего числа, задумался что-то)
Как раз про цикл for думал :D

0
5 / 5 / 4
Регистрация: 31.03.2015
Сообщений: 48
11.04.2015, 22:48 14
Я не тебе
0
0 / 0 / 1
Регистрация: 11.04.2015
Сообщений: 31
11.04.2015, 23:03  [ТС] 15
Таакс.. Я прогнал числа от 2 до 10 через свою думалку, ответы получались правильные: 2, 3, 5, 7... Пока я не дошел до проверки 11, у меня получается, что 11 не подходит... 2<=11/2. да, 11%2, с остатком, но !, следовательно первый if пропускаем, далее, насколько я понял, тут-то значению j и прибавляется 1, т.к. условие выполнилось....... Все, я понял... Вроде бы понял!) После, когда j=3, второе if тоже не выполнилось, следовательно возвращаемся обратно во вложенный цикл, то есть, условие выполняется, j опять получает +1, в итоге 4, и тогда уже значение 4>11/4 верное, 11 является простым числом! Омг, скажите мне, что я правильно думаю.
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
12.04.2015, 10:43 16
Цитата Сообщение от want_my_dream Посмотреть сообщение
Как-то не до конца понимаю, как это работает.
Плохо работает.
1) Число является простым, если делится только на единицу и само себя.
2) Если число А имеет делители отличные от единицы и А, то хотя-бы один из них будет не больше корня квадратного из А.
3) Следовательно, для проверки на простоту, нужно перебрать делители от двух до корня квадратного из А. Циклом for (j = 2; j <= sqrt(i); j++)
4) Далее автор вашего кода думает "э, sqrt работает медленно, сейчас я оптимизирую!" и втыкает j <= (i / j) с ровно тем же смыслом.

Теперь глядите. sqrt(i) считается долго. Но его можно посчитать один раз, а потом записать в условие цикла j <= sqrt_i. С другой стороны (i / j) считается заметно быстрее, но его придется считать на каждой итерации цикла. А деление, между-прочим, тоже далеко не самая быстрая операция. Итого, погнавшись за крутым решением, автор вашего учебника получил мало того что плохой, так еще и трудночитаемый код.
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
12.04.2015, 21:24 17
1. Корень можно посчитать целочисленно Ньютоном, будет быстро и без матха и без перевода в плавучку и обратно.
2. Можно и умножать для проверки диапазона вместо деления, хотя если в списке команд процессора есть мул и див, то все равно не так долго будет считать. А нет их разве что на АВР тини или ПИКах каких-нибудь нижней линейки.
3. А можно воспользоваться доказанной гипотезой Бертрана, и складывать уже найденные простые числа в массив, проверяя следующие на деление только на элементы этого массива - там их всегда будет достаточно, что гарантируют Бертран с Чебышёвым.
0
0 / 0 / 1
Регистрация: 11.04.2015
Сообщений: 31
14.04.2015, 20:54  [ТС] 18
Спасибо всем
0
14.04.2015, 20:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2015, 20:54
Помогаю со студенческими работами здесь

Модификатор доступа protected. Не понятен смысл
Модификатор доступа protected используется тогда, когда мы хотим, чтобы элемент был виден за...

Составить программу вывода на экран простых чисел их первых N натуральных чисел..
Составить программу вывода на экран простых чисел их первых N натуральных чисел..

Есть задание - но смысл не понятен, может ли кто-нибудь обьяснить чего требуется?
Есть задание - но смысл не понятен, может ли кто-нибудь обьяснить это задание? Задание: Создать...

Вложеные циклы.Составить программу вывода на экран простых чисел из первых N натуральных чисел используя решето Эратосфена.
Составить программу вывода на экран простых чисел из первых N натуральных чисел используя решето...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru