Раздел: Задачи / Простейшие /

Первые N простых чисел

Основы программирования 2.0 Основы программирования
Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее...

Условие задачи 2.66

Задача 2.66
Дано натуральное число Х. Записать в массив А первые N простых чисел, которые меньше или равны Х. Вывести на экран массив А.

Что такое простое число, я пояснил здесь. Там же мы разработали функцию, которая проверяет, является ли число простым. Для решения задачи мы можем заполнить массив числами от 2 до Х, а затем перебрать массив, проверяя числа на простоту, и записывая в массив А только простые числа.

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

Правда, остался ещё один вопрос - какой должна быть длина массива? В идеале она должна быть равна Х-1, так как единица не является простым числом. Однако число Х вводит пользователь, в этом случае мы не будем знать заранее длину массива, и нам придётся использовать динамические массивы. Но это немного усложнит программу, поэтому мы выберем более простой путь: установим длину массива, например, 1000 элементов, и будем проверять число Х, введённое пользователем. Если оно будет больше 1000, то будем выдавать пользователю сообщение о невозможности выполнить программу.

Ну а теперь примеры программ Паскале и С++.

Решение задачи 2.66 на Паскале
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.
Решение задачи 2.66 на С++
#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;
}

Ну и картинка с примером результата:

Первые N простых чисел

Можно, конечно, что-то упростить, попытаться найти готовые алгоритмы и т.п. Но это решение рабочее, и, с моей точки зрения, более понятное для начинающих.


Как стать программистом 2.0 Как стать программистом 2.0

Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее...
Помощь в технических вопросах Помощь в технических вопросах

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее...

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика