Задание 12

    Задание 12 (демо-2023). Дана программа для Редактора:

НАЧАЛО

ПОКА нашлось (>1) ИЛИ нашлось (>2) ИЛИ нашлось (>0)

  ЕСЛИ нашлось (>1)

    ТО заменить (>1, 22>)

КОНЕЦ ЕСЛИ

ЕСЛИ нашлось (>2)

  ТО заменить (>2, 2>)

КОНЕЦ ЕСЛИ

ЕСЛИ нашлось (>0)

  ТО заменить (>0, 1>)

КОНЕЦ ЕСЛИ

КОНЕЦ ПОКА

КОНЕЦ

    На вход приведённой выше программе поступает строка, начинающаяся с символа «>», а затем содержащая 39 цифр «0», n цифр «1» и 39 цифр «2», расположенных в произвольном порядке. Определите наименьшее значение n, при котором сумма числовых значений цифр строки, получившейся в результате выполнения программы, является простым числом.

    Решение задания на языках PascalABC.NET и Python приведено ниже.


PascalABC.NET

## uses School;

foreach var n in range(0, 50) do begin

  var s := '>' + 39 * '0' + n * '1' + 39 * '2';

  while ('>0' in s) or ('>1' in s) or ('>2' in s) do begin

    s := s.Replace('>1', '22>', 1)

          .Replace('>2', '2>', 1)

          .Replace('>0', '1>', 1);

  end;

  var i:=1;

  var sum:=0;

  while s[i] in '0123456789' do begin sum+=StrToInt(s[i]); i+=1; end;

  if sum.IsPrime() then print(n);

  //if s[:s.Length].Select(s->StrToInt(s)).Sum.IsPrime then print(n);

end;

Python

def IsPrime(a):

     d=2

     while d*d<=a and a%d!=0:

          d+=1

     return d*d>a

 

for n in range(0, 50):

     s = '>' + 39 * '0' + n * '1' + 39 * '2';

     while ('>0' in s) or ('>1' in s) or ('>2' in s):

          s = s.replace('>1', '22>', 1)

          s = s.replace('>2', '2>', 1)

          s = s.replace('>0', '1>', 1)

     i=0

     sum=0

     while s[i] in '0123456789':

          sum+=int(s[i])

          i+=1

     if IsPrime(sum):

          print(n)

 

    С помощью сложения строк будем формировать одну строку вида: '>' + 39*'0' + n*'1' + 39*'2'

где умножение числа 39 на строку '0' равно формированию строки '000…00' длины 39. Аналогично с числом 39 и строкой '2'. Так как количество единиц в числе нужно найти, будем перебирать переменную n от 0 до 50 и каждый раз формировать новое число.

    Пока после знака больше стоит число 0, 1 или 2, то будем заменять с помощью функции Replace() подстроку '>1' на '22>', подстроку '>2' на '2>', подстроку '>0' на '1>', как указано в условии.

    В том же цикле по n будем пробегать сформированное число и находить сумму его цифр. Если сумма цифр получается простым числом, то выводим на экран текущее число n, пробегаемое в цикле. Стоит заметить, что в Python приходится писать функцию определения простоты числа самостоятельно, в то время как в PascalABC.NET такая функция встроена в модуль School.



Последнее изменение: Понедельник, 22 мая 2023, 19:04