Раздел: Задачи / Простейшие /
Первые N простых чисел
|
Основы программирования Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее... |
Условие задачи 2.66
Задача 2.66
Дано натуральное число Х. Записать в массив А первые N простых чисел, которые меньше или равны Х. Вывести на экран массив А.
Что такое простое число, я пояснил здесь. Там же мы разработали функцию, которая проверяет, является ли число простым. Для решения задачи мы можем заполнить массив числами от 2 до Х, а затем перебрать массив, проверяя числа на простоту, и записывая в массив А только простые числа.
Пожалуй, так мы и поступим, хотя существуют специальные алгоритмы для нахождения списка всех простых чисел до какого-то числа Х, например, решето Эратосфена. Но мы не в древней Греции, у нас есть компьютеры, и мы можем писать для них программы. Так что не будем заморачиваться, а просто переберём все числа в массиве и проверим их.
Правда, остался ещё один вопрос - какой должна быть длина массива? В идеале она должна быть равна Х-1, так как единица не является простым числом. Однако число Х вводит пользователь, в этом случае мы не будем знать заранее длину массива, и нам придётся использовать динамические массивы. Но это немного усложнит программу, поэтому мы выберем более простой путь: установим длину массива, например, 1000 элементов, и будем проверять число Х, введённое пользователем. Если оно будет больше 1000, то будем выдавать пользователю сообщение о невозможности выполнить программу.
Ну а теперь примеры программ Паскале и С++.
program mytask; {$CODEPAGE UTF8} const MAX_X = 1000; var X : WORD; i, j : WORD; M : array[2..MAX_X] of WORD; A : array[2..MAX_X] of WORD; //**************************************************************** // Проверяет, является ли число простым // ВХОД : N - число // ВЫХОД : TRUE - число N простое, FALSE - не простое //**************************************************************** function IsPrimeNumber(N : WORD) : boolean; var i : WORD; begin Result := TRUE; case N of 0..3 : begin if N < 2 then Result := FALSE; //Не простое число Exit; end; end; for i := 2 to (N-1) do if (N mod i) = 0 then //Не простое число begin Result := FALSE; Break; end; end; //******************************************************************* // ОСНОВНАЯ ПРОГРАММА //******************************************************************* begin //Ввод числа Write('Введите число от 2 до 1000: '); ReadLn(X); //Проверка числа if (X < 2) or (X > MAX_X) then begin WriteLn('Число должно быть более 1 и менее ', MAX_X); WriteLn('Нажмите ENTER для выхода...'); ReadLn; Exit; //Выйти из программы, если число неправильное end; //Подготавливаем массивы for i := 2 to MAX_X do begin if i <= X then M[i] := i else M[i] := 0; A[i] := 0; end; j := 2; //Ищем простые числа и записываем их в массив А for i := 2 to MAX_X do begin if IsPrimeNumber(M[i]) then begin A[j] := M[i]; Inc(j); end; //Выйти из цикла, когда достигли Х if i > X then Break; end; //Выводим простые числа из массива А for j := 2 to X do begin //Прервать цикл, если чисел больше нет if A[j] = 0 then Break; //Вывести очередное число Write(A[j], ' '); end; WriteLn(#10#13'Нажмите ENTER для выхода...'); ReadLn; end.
#include <cstdlib>
#include <iostream>
using namespace std;
const int MAX_X = 1000;
//****************************************************************
// Проверяет, является ли число простым
// ВХОД : N - число
// ВЫХОД : TRUE - число N простое, FALSE - не простое
//****************************************************************
bool IsPrimeNumber(int N)
{
bool Res = true;
switch (N)
{
case 0 : Res = false; break;
case 1 : Res = false; break;
case 2 : Res = true; break;
case 3 : Res = true; break;
default :
for (int i = 2; i < N; i++)
if (0 == (N % i)) //Не простое число
{
Res = false;
break;
}
}
return(Res);
}
//*******************************************************************
// ОСНОВНАЯ ПРОГРАММА
//*******************************************************************
int main(int argc, char *argv[])
{
unsigned int X = 0;
unsigned int i = 0, j = 0;
unsigned int M[MAX_X-1];
unsigned int A[MAX_X-1];
setlocale(LC_ALL, "Russian");
//Ввод числа
cout << "Введите число от 2 до 1000: ";
cin >> X;
//Проверка числа
if ((X < 2) || (X > MAX_X))
{
cout << "Число должно быть более 1 и менее "
<< MAX_X << endl;
system("PAUSE");
return 1;
}
//Подготавливаем массивы
for (i = 0; i < MAX_X; i++)
{
if ((i+2) <= X) M[i] = i;
else M[i] = 1;
A[i] = 0;
}
j = 0;
//Ищем простые числа и записываем их в массив А
for (i = 0; i < MAX_X; i++)
{
if (IsPrimeNumber(M[i]))
{
A[j] = M[i];
j++;
}
//Выйти из цикла, когда достигли Х
if ((i+2) > X) break;
}
//Выводим простые числа из массива А
for (j = 0; j < (X-1); j++)
{
//Прервать цикл, если чисел больше нет
if (A[j] == 0) break;
//Вывести очередное число
cout << A[j] << ' ';
}
cout << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Ну и картинка с примером результата:
Можно, конечно, что-то упростить, попытаться найти готовые алгоритмы и т.п. Но это решение рабочее, и, с моей точки зрения, более понятное для начинающих.
|
Вступить в группу "Основы программирования"
Подписаться на канал в РУТУБ Подписаться на Дзен-канал Подписаться на рассылки по программированию |
|
Как стать программистом 2.0
Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее... |
|
Помощь в технических вопросах
Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее... |