Задание 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.