for(i=2;i<1000;i++)
for(j=2;j<=(i/j);j++)
{
if !(i%j) break;// Если у числа i есть множители, то это не простое число выходим
count << i;//просто вывод простого числа
}
Вопрос почему во втором цикле берется ограничение j<=(i/j)?

Спустя 22 минуты, 51 секунда (26.11.2009 - 11:32) Michael написал(а):
Очень верное ограничение.
Просто если j станет равно i/j , то умножив получим j*множитель = j*(i/j) = i.
Дальнейший перебор не нужен, т.к. будут получаться числа больше i.
Просто если j станет равно i/j , то умножив получим j*множитель = j*(i/j) = i.
Дальнейший перебор не нужен, т.к. будут получаться числа больше i.
Спустя 14 минут, 18 секунд (26.11.2009 - 11:46) Гость_chel написал(а):


Спустя 13 минут, 8 секунд (26.11.2009 - 11:59) Michael написал(а):
Может не сильно хорошо объяснил раньше .
Например перебираем k =1 ... (i/j) .....
Если ни одно число из Xi = (1 ... (i/j)) не является множителем для i, то
следующие числа Yi =((i/j)+1, ...) ими уж точно не станут т.к им чтобы стать множителем для i необходима пара из Xi которой нет .

Например перебираем k =1 ... (i/j) .....
Если ни одно число из Xi = (1 ... (i/j)) не является множителем для i, то
следующие числа Yi =((i/j)+1, ...) ими уж точно не станут т.к им чтобы стать множителем для i необходима пара из Xi которой нет .
Спустя 7 минут, 7 секунд (26.11.2009 - 12:06) Гость_chel написал(а):
теперь осознал....чашечка кофе Nescafe делает свое дело:)))
Спустя 15 минут, 31 секунда (26.11.2009 - 12:22) Michael написал(а):
Кстати, я бы алгоритм переписал, примерно так:
, а число 2 и так простое, сразу его можно в результат.
for(i=3;i<1000;i++)
{
isSimple = true;
for(j=2;j<=(i/j);j++)
{
if (!(i%j) )
{
isSimple = false;
break;// Если у числа i есть множители, то это не простое число выходим
}
}
if (isSimple) count << i;//просто вывод простого числа
}
, а число 2 и так простое, сразу его можно в результат.
Спустя 22 минуты, 39 секунд (26.11.2009 - 12:45) Гость_chel написал(а):
Ну если на то пошло то любое простое число больше 3 можно представить как y=6k(+-)1 и можно переписать алгоритм на основании этой формулы)))
не ну порой всякая фигня отнимает столько времени)))...и как заноза...пока не докапаешься не отстанет)
не ну порой всякая фигня отнимает столько времени)))...и как заноза...пока не докапаешься не отстанет)
Спустя 13 минут, 6 секунд (26.11.2009 - 12:58) Michael написал(а):
Я говорил в основном про то, чтобы
вынести вывод простых чисел count << i; за внутренний цикл,
потому что ему там не место.
вынести вывод простых чисел count << i; за внутренний цикл,
потому что ему там не место.
Спустя 23 минуты, 34 секунды (26.11.2009 - 13:21) Гость_chel написал(а):
а ну это я накосячил:)) когда писал) там еще cout вместо count...у меня такое бывает))
Спустя 20 часов, 27 минут, 38 секунд (27.11.2009 - 09:49) Гость_chel написал(а):
Хммм...сегодня с утра осенило, всетаки как в моем понимании можно объяснить
"Вопрос почему во втором цикле берется ограничение j<=(i/j)?"...Лучшний способ это конечно на примере...
Допустим есть некое число N, мы его хотим проверить является ли оно простым(т.е. делится на себя и 1).
Для этого мы делим число N на числа j, которое принадлежит множеству чисел от 2 до N-1 и смотрим есть ли остаток от деления, если его нет, то естественно число не является простым.
Теперь присмотримся к последовательности чисел из множества
2,3,4,5,6...N
у нас есть формула N/j=А(целая часть), по началу число А будет принадлежать множеству (j..N), но в какой то момент число А будет принадлежать множеству чисел(2..j), НО т.к. числа из диапазона (2..j) уже проверялись и они не делят число N на цело, то можно сделать вывод что любое j которое больше (N/j) не может делить число N нацело и собственно не является его множителем, поэтому проверять числа при которых не выполняется условие j<=N/j нет смысла...
ну как то так...
))
"Вопрос почему во втором цикле берется ограничение j<=(i/j)?"...Лучшний способ это конечно на примере...

Допустим есть некое число N, мы его хотим проверить является ли оно простым(т.е. делится на себя и 1).
Для этого мы делим число N на числа j, которое принадлежит множеству чисел от 2 до N-1 и смотрим есть ли остаток от деления, если его нет, то естественно число не является простым.
Теперь присмотримся к последовательности чисел из множества
2,3,4,5,6...N
у нас есть формула N/j=А(целая часть), по началу число А будет принадлежать множеству (j..N), но в какой то момент число А будет принадлежать множеству чисел(2..j), НО т.к. числа из диапазона (2..j) уже проверялись и они не делят число N на цело, то можно сделать вывод что любое j которое больше (N/j) не может делить число N нацело и собственно не является его множителем, поэтому проверять числа при которых не выполняется условие j<=N/j нет смысла...
ну как то так...

Спустя 3 минуты, 33 секунды (27.11.2009 - 09:52) Guest написал(а):
и хотя вышесказанное по сути явлется тем же самым что и(то что было сказано Michael ):
Цитата |
"Например перебираем k =1 ... (i/j) ..... Если ни одно число из Xi = (1 ... (i/j)) не является множителем для i, то следующие числа Yi =((i/j)+1, ...) ими уж точно не станут т.к им чтобы стать множителем для i необходима пара из Xi которой нет ." |
Но мне кажется что так не совсем понятно...