13 / 2 / 0
Регистрация: 27.11.2013
Сообщений: 9
|
||||||
1 | ||||||
проверка на мультипростое число28.11.2013, 11:51. Показов 2615. Ответов 32
Метки нет (Все метки)
Доброго времени суток!
Попыталась найти что-то подобное на форуме - не нашла (очень сложно сформулировать поисковый запрос по проблеме). Сама уже вторые сутки ломаю голову (понимаю, что не срок. Однако препод бьет копытом, брызжет слюной и ругается). Задача Требуется написать программу, которое будет выводить, является ли введенное с клавиатуры число "мультипростым". Под "мультипростым" числом понимается простое число, которое либо состоит из одной цифры (3, 5...), либо которое можно разбить на простые и/или мультипростые составляющие. Под разбивкой понимается отделение скольких бы то ни было левых цифр числа от остальных. Сложно объяснить, проще показать на примере: Число 7523. Само по себе число 7523 простое. Возможны три варианта разбивки: 7 523 75 23 752 3 7 - простое число. 523 - тоже просто и может быть разбито на 5 23 или 52 3. Пять - простое число. Двадцать три - тоже, причем, два и три - тоже простые. Т.е. возможен как минимум один вариант, что это число "мультипростое" => тру. Программа должна обязательно содержать две функции: нерекурсивную int is_prime(int num) (которая возвращает 1, если число простое, и 0 - в обратном случае) и рекурсивную int is_multi_prime(int num) (которая возвращает 1, если число "мультипростое", и 0 - в обратном случае). Если кому нужно, я могу выслать оригинал задания (на английском языке). Ко всему прочему, есть ограничения, установленные преподавателем: "вы должны использовать только то, что мы уже прошли на занятиях. и ни в коем случае то, что мы еще не прошли". Так что массивы, строки, классы - использовать нельзя. По сути, можно использовать только функции и рекурсию. Мои соображения по поводу решения. (это можно не читать, если само задание понятно и решение его очевидно) я, честно говоря, уже запуталась в своих размышлениях. И получившийся говнокод кидать не буду (ибо стыдно). В любом случае, is_prime - это просто.
Она используется в дальнейшем для разделения числа. Если мы хотим отделить первое число, то num1 = num\10^(n-1) - первая цифра ("7" в примере) num2 = num%10^(n-1) - все остальное("523" в примере) на входе функция is_multi_prime в первую очередь проверяет целое ли введенное число вообще (если нет, значит сразу же 0), потом разделяет его по первой цифре. Если первая цифра - прайм, то функция рекурсивно вызывается опять с параметром num2. В принципе, у меня получилось добиться того, что 7523 - мультипрайм. И даже пара самых простых непраймов и не мультипраймов давали правильные значения. Но как только числа стали четырехзначными, все посыпалось. Более того, я ни малейшего понятия не имею, как запихнуть проверку следующего разделения, если первое не прошло (например, 2311 - простое число. два - не простое, но 23 и 11 - простые, 2 и 3, 1 и 1 - простые). Ну в смысле, я могу русским/английским языком описать алгоритм, но не могу его описать на Си. З.ы, Думаю, меня вполне устроит подробный алгоритм на русском/английском, но если будет разобранный код - будет лучше. Также, могу скинуть скетч блок-схемы, конкретно лекции/семинары по курсу и т.п. Спасибо!!
0
|
28.11.2013, 11:51 | |
Ответы с готовыми решениями:
32
Visual C++ проверка ввода на число, проверка на кирилицу Проверка, делится ли число на другое число без остатка Проверка введенных данных: число/не число проверка число или не число |
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
|
|||||||||||
02.12.2013, 20:10 | 23 | ||||||||||
Исправленный код:
Добавлено через 7 минут Хм.. Наверное, так правильнее:
1
|
13 / 2 / 0
Регистрация: 27.11.2013
Сообщений: 9
|
|
03.12.2013, 00:41 [ТС] | 24 |
После проверки преподавателем, было снято два бала, за то что программа не правильно обрабатывает нули.
например, число 22307. Остальные замечания приняла к сведению. Qwertiy, к сожалению, прямо сейчас не могу просмотреть внимательно коды - надо на другие задачи переключаться. Но позже - обязательно. Спасибо
0
|
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
|
|
03.12.2013, 01:22 | 25 |
Эм.. А как их надо обрабатывать? Про это в условии ничего не было. Вполне логично, что лидирующие нули на результат не влияют.
0
|
13 / 2 / 0
Регистрация: 27.11.2013
Сообщений: 9
|
|
03.12.2013, 15:17 [ТС] | 26 |
Qwertiy, говорят, что вылетает, если один ноль в числе
__ и действительно, 22307 выдает не мультипрайм
0
|
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
|
|
03.12.2013, 17:18 | 27 |
Где что вылетает?
Вот я беру свой код отсюда и всё работает на числах от 0 до 10000: http://codepad.org/cVMZS41g. Добавлено через 5 минут Неправда: http://codepad.org/fzStjjF6.
0
|
Модератор
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
|
|
03.12.2013, 18:20 | 28 |
Угу, только в вашем варианте ноль и один - тоже простые числа. Вам уже несколько реализаций функции is_prime() представили, где этой ошибки нет. Точно читаете, что пишут?
А не должно бы? 22 - уже не простое число, до нуля и дело не доходит.
0
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
03.12.2013, 18:40 | 29 |
22307 = 223 * 7 (223 - простое, 7 - тоже)
223 = 2 * 23 23 = 2 * 3 Здесь * - операция "расщепления" чтобы число было мультипраймом достаточно существования одной серии расщеплений
0
|
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
|
|
03.12.2013, 18:43 | 30 |
В моём ни 0, ни 1 простыми не являются. Но в качестве особого случая стоит что 1 - мультипростое (т. к. это несколько раз написано в теме, в том числе в стартовом посте.
Ещё раз. Неправда, на 22307 мой код выдаёт, что оно мультипростое. См ссылку выше. А если внимательнее посмотреть обе ссылки, то вот: Код
22307 as 223 07 223 as 2 23 2 as 2 23 as 2 3 2 as 2 3 as 3 7 as 7
0
|
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
|
|
03.12.2013, 19:04 | 32 |
Не годится. Надо на 2 части, а не на 3.
22 307 - не подходит, т. к. 22 делится на 2. 2 2307 - не подходит, т. к. 2307 делится на 3. А из остального такие три куска не получатся.
0
|
03.12.2013, 19:15 | 33 |
ну, я изначально предполагал любое число составляющих, а не 2, опираясь на условие
0
|
03.12.2013, 19:15 | |
03.12.2013, 19:15 | |
Помогаю со студенческими работами здесь
33
Проверка на число Проверка на число Проверка на число проверка на число Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |