Найти абсолютно простые числа в заданном интервале - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

Число называется абсолютно простым, если при любой перестановке его цифр получается простое число. Составьте программу, которая находит абсолютно простые числа. а) от 1 до 100 б) от a до b, 1<=a<b<=32567

Решение задачи: «Найти абсолютно простые числа в заданном интервале»

textual
Листинг программы
  1. function isPrime(N : Integer) : Boolean;
  2. var
  3.   D, Q, dD : Integer;
  4. begin
  5.   Result := False;
  6.   if N <= 1 then Exit;
  7.   if (N >= 5) and (((N - 1) mod 6 = 0) or ((N + 1) mod 6 = 0)) then
  8.     begin
  9.       D := 5;
  10.       dD := 2;
  11.       Q := Trunc(Sqrt(N));
  12.       while D < Q do
  13.         if N mod D = 0 then
  14.           Exit
  15.         else
  16.           begin
  17.             D += dD;
  18.             dD := dD xor 6;
  19.           end;
  20.       Result := True;
  21.     end
  22.   else
  23.     Result := (N = 2) or (N = 3);
  24. end;
  25.  
  26. function SuperPrime(n : Integer) : Boolean;
  27. var
  28.   a : array [0..10] of Integer;
  29. begin
  30.   Result := False;
  31.   if Not isPrime(n) then Exit;
  32.  
  33.   a[0] := 0;
  34.   var t := n;
  35.   while t > 0 do
  36.     begin
  37.       a[0] += 1;
  38.       a[a[0]] := t mod 10;
  39.       t := t div 10;
  40.     end;
  41.  
  42.   if a[0] = 1 then
  43.     begin
  44.       Result := True;
  45.       Exit;
  46.     end;
  47.  
  48.   // Отсортируем массив, чтобы генерировать перестановки в лексографическом порядке
  49.   var i, j : Integer;
  50.   for i := 2 to a[0] do
  51.     begin
  52.       var key := a[i];
  53.       j := i - 1;
  54.       while (j >= 1) and (a[j] > Key) do
  55.         begin
  56.           a[j + 1] := a[j];
  57.           Dec(j);
  58.         end;
  59.       a[j + 1] := key;
  60.     end;
  61.    
  62.   // 0. Получим число из начальной перестановки
  63.   t := 0;
  64.   for var p := 1 to a[0] do
  65.     begin
  66.       t := t * 10 + a[p];
  67.       if not odd(a[a[0]]) then Exit; // Если в числе ( > 9) есть чётная цифра...
  68.     end;
  69.   if Not isPrime(t) then Exit;
  70.  
  71.   // 1. Просматриваем а1, ..., аn с конца до тех пор, пока не попадется ai<ai+1.
  72.   //    Если таковых нет, то генерация закончена.
  73.   repeat
  74.     i := a[0] - 1;
  75.     while (i > 0) and (a[i] >= a[i+1]) do
  76.       i -= 1;
  77.      
  78.     if i > 0 then
  79.       // 2. Рассматриваем ai+1, ai+2, ..., an. Найдем первый с конца am
  80.       //    больший ai и поменяем их местами.
  81.       begin
  82.         j := a[0]+1;
  83.         repeat
  84.           j -= 1;
  85.         until a[j] > a[i];
  86.        
  87.         Swap(a[i], a[j]);
  88.        
  89.         // 3. ai+1, ai+2, ..., an переставим в порядке возрастания
  90.         //    (для этого достаточно её переписать с конца).
  91.         j := i + 1;
  92.         while a[0]+1+i-j > j do
  93.           begin
  94.             swap(a[j], a[a[0]+1+i-j]);
  95.             j += 1;
  96.           end;
  97.          
  98.         // 4. Получем число из найденной перестановки
  99.         t := 0; for var p := 1 to a[0] do t := t * 10 + a[p];
  100.         if Not isPrime(t) then Exit;
  101.       end;
  102.      
  103.     // 5. Возвращаемся к пункту 1.
  104.   until i = 0;
  105.  
  106.   Result := True;
  107. end;
  108.  
  109. begin /// Основную программу изменить под свои нужды
  110.   for var n := 1 to 2147483647 do
  111.     if SuperPrime(n) then
  112.       Print(n);
  113.   WriteLn(NewLine, 'end.');
  114. end.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.625 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы