1 / 1 / 0
Регистрация: 23.10.2016
Сообщений: 259

Определить, является ли заданное натуральное число простым

07.01.2017, 18:35. Показов 5953. Ответов 74
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Определить, является ли заданное натуральное число простым.
Выходные данные: Вывести YES или NO.
Ввод 29
Вывод YES
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.01.2017, 18:35
Ответы с готовыми решениями:

Определить, является ли заданное натуральное число простым
Определить, является ли заданное натуральное число простым

Определить, является ли заданное натуральное число простым
Определить, является ли заданное натуральное число простым. Циклический алгоритм. Блок схема, тест. Кода не надо. Добавлено...

Рекурсия: определить, является ли заданное натуральное число простым
Написать функцию определения, является ли заданное натуральное число простым. (рекурсивно)

74
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
06.10.2022, 21:01
Студворк — интернет-сервис помощи студентам
Если ты говоришь о функции main, то ее вызывает операционная система. И иногда по возврату она можеть судить об успешности выполнения. Но ее пути неисповедимы. Поэтому на всякий случай мы возвращаем 0.
0
1 / 1 / 0
Регистрация: 22.09.2022
Сообщений: 45
06.10.2022, 21:10
Без команды return 0 мой код понимает простое это число или нет ввёл пользователь, система выдаёт мне столько значений какое число я ввёл. Допустим ввёл я число 5, прога напишет что это число prime, но она так же мне ещё 4 примера выдаст, хотя мне нужен ответ по одному значению 5 в данном случае. Если я пишу команды return 0 после cout, то все окей. Я так понимаю в моем коде без return 0 не обойтись. Объясните пожалуйста, почему в моем приме без return 0 не обойтись и почему именно 0?
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
06.10.2022, 21:48
Команда return 0 прекращает выполнение программы и соответственно выполнение цикла. Поэтому в цикле нужно проверять только на не-простоту, и выдавать сообщение с завершением программы (цикла). А сообщение, что число простое - выдавать только если весь цикл пройден и делителей не найдено.

В вашем случае, как программа написана, так она и работает. Она так и будет выдавать ответы для каждого i, пока не выполнится условие остановки цикла i * i <= n.

C
1
2
3
4
5
6
7
8
9
for (int i = 2; i * i <= n; i++)     
{
    if (n % i == 0)
    {    
        cout << n << " is not prime " << endl;
    }
} 
       
else cout << n << " is prime " << endl;    
Вот так правильно:

C
1
2
3
4
5
6
7
8
9
10
11
for (int i = 2; i * i <= n; i++)     
{
    if (n % i == 0)
    {    
        cout << n << " is not prime " << endl;
        return 0;
    }
} 
       
else cout << n << " is prime " << endl;
return 0;    
Добавлено через 4 минуты
Именно return 0 нужно потому, что ваша основная выполняемая функция (тело программы) объявлена целочисленной int main {}, и должна вернуть целое число. Обычно при штатном окончании программы возвращается 0, а при возникновении ошибки - код ошибки.
0
1 / 1 / 0
Регистрация: 22.09.2022
Сообщений: 45
06.10.2022, 21:50
Благодарю за объяснение! Все понятно. А если правильный код переоборудовать под поиск всех простых чисел до заданного, нужно просто добавить условную конструкцию или там глобально нужно поменять код?
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
06.10.2022, 22:44
Нужно добавить ещё один цикл, который будет перебирать переменные, которые в свою очередь будут проверяться на простоту. Саму проверку на простоту при этом лучше оформить в виде функции, которая будет возвращать результат проверки false-true. как-то так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bool test_on_prime(int x)
{
    if(x == 1) return false;
    if(x == 2) return true;
 
    for (int i = 2; i * i <= x; i++)     
        if (n % i == 0) return false;
 
    return true;
}
 
 
 
 
int N = 100;
 
for(int i = 2; i < N; i++)
{
    if(test_on_prime(i)) cout << i << " is prime " << endl;
}
Прога будет проверять числа, начиная с 2. Число N нужно вводить с клавиатуры, я для простоты привел пример с фиксированным значением.
0
1 / 1 / 0
Регистрация: 22.09.2022
Сообщений: 45
06.10.2022, 23:06
Спасибо.
0
1 / 1 / 0
Регистрация: 22.09.2022
Сообщений: 45
07.10.2022, 21:48
alexu_007, только в коде который вы прислали есть какая-то неточность. Если ввести например число 49, то прога выдаст is prime.

Добавлено через 3 часа 53 минуты
Дело мне кажется в условии if (n % i == 0) 49 под это условие не подходит, как и некоторые другие не простые числа.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
08.10.2022, 05:23
Цитата Сообщение от alexu_007 Посмотреть сообщение
Именно return 0 нужно потому, что ваша основная выполняемая функция (тело программы) объявлена целочисленной int main {}, и должна вернуть целое число. Обычно при штатном окончании программы возвращается 0, а при возникновении ошибки - код ошибки.
Что значит "именно нужно"? В функции int main() НЕ нужно писать return 0. Функция main и сама вернет 0, без вашего return 0.

Цитата Сообщение от alexu_007 Посмотреть сообщение
Вот так правильно:
C++
1
2
3
4
5
for (int i = 2; i * i <= n; i++)     
{
...
} 
else ...
"Правильно"? for ... else? Что это за "правильная" конструкция такая?

Цитата Сообщение от Radanovich Посмотреть сообщение
только в коде который вы прислали есть какая-то неточность. Если ввести например число 49, то прога выдаст is prime.
Ни один из приведенных alexu_007 вариантов кода невозможно скомпилировать. Как вы умудрились получить от него "49 is prime"? Что именно вы запускали?
0
1 / 1 / 0
Регистрация: 22.09.2022
Сообщений: 45
08.10.2022, 09:31
TheCalligrapher, я обратил внимание, что else находиться за пределами компаунд стейтмента for и запихнул его туда. На return 0 прога не ругалась и дала спокойно мне этот код скомпилять. Но проблема в том, что код не корректно работает. Если убрать у оператора return значение 0, то компилятор начинает ругаться. Пишет 'main': function must return a value. Но в то же время вы говорите, что данный оператор пишется без значения 0.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
08.10.2022, 11:11
Цитата Сообщение от Radanovich Посмотреть сообщение
я обратил внимание, что else находиться за пределами компаунд стейтмента for и запихнул его туда.
В результате получилась полная чушь. Нет смысла жаловаться на то, что она не работает правильно.

Цитата Сообщение от Radanovich Посмотреть сообщение
Пишет 'main': function must return a value. Но в то же время вы говорите, что данный оператор пишется без значения 0.
Что??? Где это такое сказал?

Я лишь сказал, что никакого return вообще писать не обязательно.
0
1 / 1 / 0
Регистрация: 22.09.2022
Сообщений: 45
08.10.2022, 12:09
Да. Извиняюсь. Не правильно прочитал. Если там return не нужен, тогда как можно решить мою проблему, потому что я пока не совсем понимаю как можно написать рабочий код. Подскажите пожалуйста
0
2410 / 1942 / 764
Регистрация: 27.07.2012
Сообщений: 5,578
08.10.2022, 12:17
Цитата Сообщение от Radanovich Посмотреть сообщение
Подскажите пожалуйста
А в каком виде код есть сейчас?
0
1 / 1 / 0
Регистрация: 22.09.2022
Сообщений: 45
08.10.2022, 12:23
int main()
{
cout << "Enter number" << endl;
int n;
cin >> n;
for (int i = 2; i * i <= n; i++)
{
if (n % i == 0)
{
cout << n << " is not prime " << endl;
}
else
cout << n << " is prime " << endl;
}
}
Сори за такой формат. Копирую с телефона. После команды вывода в поток я вставлял return 0 , как мне и посоветовали для того чтобы прервать цикл, но это не верно. Цикл это конечно останавливает, но неправильно обрабатывает непростые числа такие как 49 например.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
08.10.2022, 12:32
Radanovich, Все с тобой понятно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
cout << "Enter number" << endl;
int n, i;
cin >> n;
for (i = 2; i * i <= n; i++)
  if (n % i == 0) break;
if (i*i <n)
  cout << n << " is not prime " << endl;
else
  cout <<  n << " is prime " << endl;
return 0;
}
Цикл должен пройти по всем возможным делителям.

Добавлено через 1 минуту
А у тебя любое нечетное окажется простым.
0
1 / 1 / 0
Регистрация: 22.09.2022
Сообщений: 45
08.10.2022, 12:43
Байт, спасибо за ответ. Я правда команду break ещё не проходил. Без неё возможно обойтись?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
08.10.2022, 12:52
Цитата Сообщение от Radanovich Посмотреть сообщение
Без неё возможно обойтись?
Попробуем
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
cout << "Enter number" << endl;
int n;
bool flag= true;
cin >> n;
for (int i = 2; i * i <= n; i++)
  if (n % i == 0) flag = false;
if (flag==false)
  cout << n << " is not prime " << endl;
else
  cout <<  n << " is prime " << endl;
return 0;
}
Только будут лишние действия, когда уже ясно, что число не простое.
Цитата Сообщение от Radanovich Посмотреть сообщение
команду break ещё не проходил.
Да и циклы без break и continue обычно не проходят. Это ты что-то проспал
0
1 / 1 / 0
Регистрация: 22.09.2022
Сообщений: 45
08.10.2022, 13:37
Спасибо ещё раз за ответ. Проанализирую код который вы мне прислали и представлю его преподавателю.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
08.10.2022, 20:03
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
"Правильно"? for ... else? Что это за "правильная" конструкция такая?
Ну else случайно туда попало, при копировании. Лень каждый раз одно и то же набирать.

Добавлено через 3 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ни один из приведенных alexu_007 вариантов кода невозможно скомпилировать. Как вы умудрились получить от него "49 is prime"? Что именно вы запускали?
Я и не выкладывал "готовое решение под ключ". Сделать код компилируемым - т.е. добавить "int mail()" и прочий официоз - задача для обучающегося.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
08.10.2022, 20:05
Цитата Сообщение от alexu_007 Посмотреть сообщение
Сделать код компилируемым - т.е. добавить "int mail()" и прочий официоз - задача для обучающегося.
Речь идет не об "int mail()", а о том, что код неполон именно в ключевых моментах. В первом вариате - некий for ... else. В последнем - проверка несуществующей переменной n.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
08.10.2022, 20:19
Ну если видите, что else вставлено ошибочно - самим убрать не судьба? Radanovich, ты тупо копируешь то что тебе предлагают, не понимая, что ты копируешь и как это работает?

C
1
2
3
4
5
6
7
8
9
10
11
    for (int i = 2; i * i <= n; i++)     
    {     
        if (n % i == 0)     
        {             
            cout << n << " is not prime " << endl;
            return 0;     
        } 
    }
         
    cout << n << " is prime " << endl;
    return 0;
Добавлено через 7 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В последнем - проверка несуществующей переменной n.
А это тоже ошибка копирования тренировка интеллекта для топикастера - догадается ли n на x поменять? Или сообщение компилятора о несуществующей переменной n повергнет его в абсолютный ступор?

Если да, то может ну его нафиг, это программирование? Сложное какое-то оно...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.10.2022, 20:19

Проверить, является ли заданное натуральное число простым
у меня есть алгоритм вывода простых чисел, как зделать так штоб можна было ввести число и выдать сообщение што оно просте или нет void...

Напишите рекурсивную функцию, проверяющую, является ли заданное натуральное число простым
При написании программы необходимо использовать рекурсию. Напишите рекурсивную функцию, проверяющую, является ли заданное натуральное число...

Написать рекурсивную функцию, определяющую, является ли заданное натуральное число простым
Помогите сделать это задание.... Написать рекурсивную функцию, определяющую, является ли заданное натуральное число простым.

Определить, является ли заданное число простым
Записать алгоритм, проверяющий является ли заданное число простым как рекурсивную функцию. Вывести на экран все простые числа, не...

Определить, является ли заданное число простым
Пользователь вводит с клавиатуры число в диапазоне от 1 до 20. Вывести на экран S, если число является простым. Не выводить ничего, если...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru