Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/26: Рейтинг темы: голосов - 26, средняя оценка - 4.96
1 / 1 / 0
Регистрация: 23.10.2016
Сообщений: 259

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

07.01.2017, 18:35. Показов 5898. Ответов 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,309
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,309
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
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
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
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
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
2404 / 1934 / 763
Регистрация: 27.07.2012
Сообщений: 5,573
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,309
08.10.2022, 20:03
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
"Правильно"? for ... else? Что это за "правильная" конструкция такая?
Ну else случайно туда попало, при копировании. Лень каждый раз одно и то же набирать.

Добавлено через 3 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ни один из приведенных alexu_007 вариантов кода невозможно скомпилировать. Как вы умудрились получить от него "49 is prime"? Что именно вы запускали?
Я и не выкладывал "готовое решение под ключ". Сделать код компилируемым - т.е. добавить "int mail()" и прочий официоз - задача для обучающегося.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13207 / 6841 / 1823
Регистрация: 18.10.2014
Сообщений: 17,304
08.10.2022, 20:05
Цитата Сообщение от alexu_007 Посмотреть сообщение
Сделать код компилируемым - т.е. добавить "int mail()" и прочий официоз - задача для обучающегося.
Речь идет не об "int mail()", а о том, что код неполон именно в ключевых моментах. В первом вариате - некий for ... else. В последнем - проверка несуществующей переменной n.
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,309
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 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru