[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Глюки с остатком от деления
myfit
Приветствую всех,
Решил наконец-таки освоить программирование, изучаю циклы, есть задачка найти простые числа.

Код:



$number = 100;

for ($i = 2; $i < $number; $i++) {

if ($number % $i != 0) {
echo $number, ' является простым числом';
}
}




Насколько понимаю логику этой конструкции, остаток от деления 100 / 3 не равен нулю, значит тело условия не должно исполниться. Но оно исполняется. Помогите пожалуйста разобраться, где ошибка?

Благодарствую!
Michael
Цитата (myfit @ 14.11.2019 - 01:20)
остаток от деления 100 / 3 не равен нулю, значит тело условия не должно исполниться.

Так у вас в условии стоит != 0 т.е. получится что 100%3 !=0 или 1 != 0 что верно и поэтому тело условия выполнится.

Плюс логика у вас неверная, почитайте что такое простые числа.

_____________
There never was a struggle in the soul of a good man that was not hard
myfit
Переосмыслил немного логику и подход. Использовал конструкцию:

if (is_int ($temp / $simple[$i]) == TRUE)

если правильно понимаю, такой подход является неким аналогом использования системы флагов. Эх, такая каша в голове за 2 недели чтения мануалов.. Господа программисты, скажите плз, за год реально научиться кодить, при ежедневных несколько-часовых тренировках? -) Стоит ли оттачивать навыки в каком-то одном направлении (парсеры, или сайты или админки) или же лучше в первый год пытаться решать задачи из разных направлений?
Michael
С оператором % чище было.
Вы так и не предоставили финальный код который проверяет целое число или нет.

_____________
There never was a struggle in the soul of a good man that was not hard
myfit
Переписал с учетом флагов,

$number = 20000;
$testArr = range (2, $number, false);
$simpleArr = [];

function isSimple ($num) {
for ($j = 2; $j < $num; $j++) {
if ($num % $j === 0)
return TRUE;
}
}




for ($i = 2; $i < $number; $i++) {
if (isSimple($i) === TRUE)
$testArr[$i] = FALSE;
if (!isset($testArr[$i]))
$simpleArr[] = $i;
}

var_dump($simpleArr);




И переделал обратно условие с %. Как оказалось, конструкция if (is_int ($temp / $simple[$i]) == TRUE) на ~10% медленнее операции сравнения на остаток (%). Думаю, как бы еще оптимизировать этот код традиционными методами. Двойной вложенный цикл дает большую нагрузку на процессор. Возможно ли решить задачу поиска простых чисел без использования двойного цикла? Пока что никаких других идей в голову не приходит...

PS: нашел алгоритм "решето Эратосфена", прирост скорости оказался в ~130 раз большим по сравнению с моим вариантом. Но хотелось бы сначала свой вариант дооптимизировать...


PPS: в учебниках пишут, что использовать цикл в функциях = плохой тон. Как в этом примере лучше поступить, вынести второй цикл за пределы функции, передавать в ней только условие проверки деления двух чисел на остаток?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.