C++ : Вопрос по программе, которая находит все простые числе в интервале от 1 до 100

программирование C++ си

Задача: Напишите программу, которая находит все простые числе в интервале от 1 до 100.

Почему 1) вариант логически не правильный, а 2) вариант логически правильный?

============ 1 ============
#include <iostream>
using namespace std;
int main()
bool simple;
for(int i = 1; i <= 100; i++)
{
simple = true;
for(int j = 2; j <= i/2; j++)
if((i%j) == 0) simple = false;
if(simple) cout << i << "\n";
}
cin.get();
}
============ 2 ============
#include <iostream>
using namespace std;
int main()
{
int i, j;
bool isprime;

for(i=1; i < 100; i++)
{
isprime = true;
// see if the number is evenly divisible
for(j=2; j <= i/2; j++)
// if it is, then it is not prime
if((i%j) == 0) isprime = false;
if(isprime)
cout << i << " is prime.\n";
}
}

Примечание:
Извините, ошибку допустил.
============ 1 ============
#include <iostream>
using namespace std;
int main()
{
bool simple;
for(int i = 1; i <= 100; i++)
{
simple = true;
for(int j = 2; j <= i/2; j++)
if((i%j) == 0) simple = false;
if(simple) cout << i << "\n";
}
cin.get();
}

Вопрос тот же.

Примечание:
Ребята, вариант 1-й не раобтает, поэтому он не правильный. Это первое.
Второе, объясните мне пожалуйста, почему вот в этой строке
for(j=2; j <= i/2; j++)
надо "i/2", а если ставишь число, то уже программа работает не правильно.

Вот в чем главный вопрос...
Ответы:
Потому что "простой" по-английски - prime. На код ещё не смотрел :)
Потому что у вас преподаватель сишник =)
В первом случае переменная j заново инициализируется каждую итерацию цикла по i, что чуть менее эффективно.
И потом - 100 явно не является простым числом, получается лишняя итерация в случае 1 =)
О да, инициализируется оно видите ли лишний раз. А что оно на каждом шаге i/2 итераций делает вместо sqrt(i) - всем пофиг. И тот, и другой вариант - лажа.
Ну я пытался ответить на вопрос, просто.
Так, конечно, оба варианта уровня первокурсника, который не ходил в школе на факультативы. =(
Вообще-то в теории сказано, что простые числа начинаются с 2, а ваша программа выводит единицу, как первое простое число. [1]
Во-первых вместо "j<=i/2" поставьте "j<=sqrt(i)" (не забудте подключить библиотеку math.h). Во-вторых, исходя из теории, начинайте проверку с 2, т.е
for (int i = 2; i<=100; i++){/*...*/}
Вот вам еще для разнообразия вариант из все той же википедии.
в таком виде как в дополнении 1 у меня программа превосходно работала (только 1 выдавала в качестве простого числа)
вообще единственная логическая разница которую я заметил, это то, что в одном случае i<100 в другом i<=100, судя по условию правильно будет i<=100
кроме того, i=1 в цикл вносить не надо, это особое число не простое и не составное, начинать цикл стоит с i=2
человекпакет  - правильно.
Держи быстрый и правильный алгоритм - http://codepaste.ru/6939


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.