Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2012, 14:34   #11
Eshiru
Новичок
Джуниор
 
Регистрация: 27.11.2012
Сообщений: 13
По умолчанию

Наконец-то разобрался и отредактировал код, чтоб был более читабельным.
Проблема не решена: программа работает, но кроме простых чисел показывает и некоторые непростые. Первый пример - число 15.
Eshiru вне форума Ответить с цитированием
Старый 27.11.2012, 14:50   #12
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Неработающий код приведите, пожалуйста. Тот, который в заглавном (исправленном) сообщении, по-прежнему несёт в себе бредовую конструкцию 10>i<Chislo1.
Abstraction вне форума Ответить с цитированием
Старый 27.11.2012, 14:57   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так проблема у Вас в том, что Вы плохо представляете, какие делители могут быть у числа!
что за 10>i<Chislo1 ?!
Это ни в какие ворота не лезет.
хотя бы уж так:
Код:
for (i=2; i< (Chislo1 / 2); i++) 
...
хотя, в общем случае, цикл перебора делителей достаточно крутить до (корень квадратный из числа)+1

ну и ещё. число 2 является простым.... Я не вижу, чтобы у Вас в коде это учитывалось!

p.s. не понимаю, откуда у Вас такая неприязнь к чужим решениям! Проще взять хорошее чужое решение и разобраться в нём, переварить его, сделать его своим и использовать в дальнейшем..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.11.2012, 15:05   #14
Eshiru
Новичок
Джуниор
 
Регистрация: 27.11.2012
Сообщений: 13
По умолчанию

Поправил: бредовую конструкцию "10>i<Chislo1" заменил на "10>i&&i<Chislo1". Еще одна поправка: код рабочий, но с описанной ранее особенностью.
Теперь о делителях: а почему я не могу во вложенном цикле перебирать делители от 1-цы до 9-ки до того момента, пока делитель не станет равен или 9-ти или самому числу?
По поводу чужих решений: самое простое запомнить чужой вариант. В безвыходных ситуациях - это, конечно, лучший вариант, НО: я пытаюсь разобраться в своих ошибках, а это, на мой взгляд - лучший способ обучения. Сам разобраться не смог - попросил помощи. Некоторые нюансы на будущее учту - как в случае с конструкцией "10>i<Chislo1" . За это спасибо.
Eshiru вне форума Ответить с цитированием
Старый 27.11.2012, 15:07   #15
Eshiru
Новичок
Джуниор
 
Регистрация: 27.11.2012
Сообщений: 13
По умолчанию

Еще пометка: і - это и есть делитель в моем коде.
Кроме того, Ваше замечание по поводу 2-ки абсолютно справедливо, однако для исправления этой погрешности мне не потребуется много времени. Главная задача - убрать числа типа 15.

Последний раз редактировалось Eshiru; 27.11.2012 в 15:09.
Eshiru вне форума Ответить с цитированием
Старый 27.11.2012, 15:47   #16
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
почему я не могу во вложенном цикле перебирать делители от 1-цы до 9-ки до того момента, пока
делитель не станет равен или 9-ти или самому числу
погодите. Вы и в программе пишете так же, как и говорите!
Давайте разберёмся.
Вы делители будете перебирать от 2 до 9 или до числа ???!!
Если до самого числа, то при чём здесь "до 9" ?!!
Если до 9-ки, то это НЕВЕРНО!

Вот в этом недопонимании, имхо, и заключена Ваша проблема...

кроме того, нет смысла перебирать делители до самого числа. Это не ошибка, это избычточно! Если не нашёлся делитель на диапазоне от 2 до КореньКвадратныйИзЧисла (включительно) - то дальше он уже ТОЧНО НЕ НАЙДЁТСЯ! Смысла в переборе нет никакого! Хотя и результаты это не испортит. Просто дольше будет программа "впустую" перебирать числа...

p.s. переменная ostatok вам тоже не нужна, прямо в if - сравнивайте значение:
if ( chislo1 % i == 0 ) ... // число не простое!;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.11.2012, 16:06   #17
Eshiru
Новичок
Джуниор
 
Регистрация: 27.11.2012
Сообщений: 13
По умолчанию

Да, да, да, Сергей, программу я именно так и реализовываю, как говорю. И переменную ostatok я тоже не использовал, а делал как Вы пишете - путем условия if. Я много вариантов перебрал, но нужного результата не достиг. Сюда запостил последнюю из реализаций, поэтому так.

Ваш вопрос: "Вы делители будете перебирать от 2 до 9 или до числа ???!!"
Ответ: до самого числа перебирать делитель смысла нет, и это я понял. Поэтому поставил условие 10>i&&i<Chislo1. Это условие предполагает, что если число меньше 10, то делитель будет перебираться до этого числа. Если число больше или равно 10, то перебирает до 9-ти. При этом условие if (Ostatok==0) {break;} предполагает, что как только оно найдет делитель, на который число делится без остатка, Chislo1 изменится на единицу, а делитель дальше не перебирается (даже если он до 9-ти не добрался). Т.е., я так предполагаю, что после оператора break внутренний цикл заканчивается и во внешнем цикле должно сработать Chislo1++. По моей задумке, если нашелся делитель, на который число делится без остатка, то дальше делители не перебираются, а изменяется Chislo1.
Именно такая реализация продиктована тем, что я не знаю Вашей аксиомы: "Если не нашёлся делитель на диапазоне от 2 до КореньКвадратныйИзЧисла (включительно) - то дальше он уже ТОЧНО НЕ НАЙДЁТСЯ!" Т.е. теперь уже знаю, но неужели нельзя реализовать программу БЕЗ этого знания, что я и попытался сделать?
И еще: СПАСИБО за участие.
Eshiru вне форума Ответить с цитированием
Старый 27.11.2012, 16:11   #18
Eshiru
Новичок
Джуниор
 
Регистрация: 27.11.2012
Сообщений: 13
По умолчанию

Сергей, переписать программу при помощи Вашей подсказки "Если не нашёлся делитель на диапазоне от 2 до КореньКвадратныйИзЧисла (включительно) - то дальше он уже ТОЧНО НЕ НАЙДЁТСЯ!" - две минуты. И я уже понимаю, что она будет правильно работать.
Однако прошу раскритиковать мой предыдущий пост. ПОЧЕМУ так нельзя?
Eshiru вне форума Ответить с цитированием
Старый 27.11.2012, 16:15   #19
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

извините, я не понял ваших рассуждений... Какая разница, меньше число 10 или нет?! От этого что-то меняется?! Вам нужно искать делители. числа. Если они есть (от 2 и до чего-угодно), значит число НЕ ПРОСТОЕ.
Откуда у Вас возникла (ошибочная) идея, проверять числа меньше 10 и больше десяти по разным алгоритмам?! Вот в этом и есть ваш основной "косяк"!
Всё остальное уже детали... (например, я не знаю C и не понимаю, как Вы опеределяете, Break'ом закончился цикл или просто все числа перебраны?!
я бы для этого завёл дополнительную переменную. и перед тем, как сделать Break изменял бы эту переменную.
а после цикла проверял эту переменную и по ней определял - вышли мы из цикла по break (а значит, число не простое), или цикл дошёл до самого последнего делителя и ни разу число не было кратно, а значит, число простое!

ферштейн?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.11.2012, 16:21   #20
Eshiru
Новичок
Джуниор
 
Регистрация: 27.11.2012
Сообщений: 13
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача о нахождении простых чисел в матрице alexamazzing Помощь студентам 1 26.10.2012 02:11
Вывод на экран N простых чисел. Renge Помощь студентам 2 13.09.2011 18:53
задача по массивам // Delphi //код прилагается Makotya Помощь студентам 2 20.05.2009 22:04
Вывод простых чисел. MAKEDON Помощь студентам 1 10.03.2009 16:55
Где ошибка в моем коде? artemavd БД в Delphi 12 22.09.2008 14:28