Определить, существует ли ровное число, состоящее ровно из l цифр - Pascal
Формулировка задачи:
Число назовем ровным, если каждая цифра числа, кроме самых крайних, меньше среднего
арифметического двух ее соседних цифр. То есть, если число x = an·10n+an−1·10n−1+...+a1 ·10+a0, то для всех i = 1...(n − 1) верно, что ai < (ai−1 + ai+1)/2.
Напишите программу, которая определяет, существует ли ровное число, состоящее ровно из l цифр, а если существует, то какое из них максимально.
Формат входного файла
Входной файл содержит единственное натуральное число l (1 ≤ l ≤ 100) — длина искомого
ровного числа.
Формат выходного файла
В выходной файл выведите максимальное ровное число длины l или −1, если такого числа не существует.
Примеры
Input1.in 3
Output1.out 989
Решение задачи: «Определить, существует ли ровное число, состоящее ровно из l цифр»
textual
Листинг программы
Uses Crt; Function FlagSt0(S : String) : Boolean; var k : Byte; Begin FlagSt0:=True; For k:=1 to Length(S) do If S[k]<>'0' then Begin FlagSt0:=False; Break; end; End; Function FlagRovnoe(S : String) : Boolean; Var k : Byte; Begin FlagRovnoe:=True; For k:=2 to Length(S)-1 do If Ord(S[k])-48>=(Ord(S[k-1])-48+Ord(S[k+1])-48)/2 then Begin FlagRovnoe:=False; Break; End; End; Function DecSt(S : String; k : Longint) : String; Var ii : Byte; ss : String; Begin ss:=S; ii:=Length(S); While ii>0 do If ss[ii]>'0' then Begin ss[ii]:=Chr(Ord(ss[ii])-1); Break; End else Begin ss[ii]:='9'; Dec(ii); End; If k>1 then DecSt:=DecSt(ss,k-1) else DecSt:=ss; End; Var f,f0 : text; St : String; L,i : Byte; Begin ClrScr; Assign(f0,'Input.in'); Assign(f,'Output.out'); Reset(f0); Readln(f0,L); Close(f0); St:=''; For i:=1 to L do St:=St+'9'; While (not FlagSt0(St)) and (not FlagRovnoe(St)) do Begin St:=DecSt(St,1); GoToXY(10,WhereY); Write(St); End; ReWrite(f); If FlagSt0(St) then Writeln(f,'-1') else Writeln(f,St); Close(f); end.
Объяснение кода листинга программы
- Тип программы:
По всей видимости, это программа на языке Pascal, так как упоминаются ключевые слова и конструкции, характерные для этого языка, такие как
Uses
,Function
,Var
,Begin
,End
,Assign
,Reset
,Readln
,Close
,GoToXY
,Write
,ReWrite
. - Функции:
В коде определены три функции:
- FlagSt0 - проверяет, содержит ли строка только цифры, и возвращает True, если это так, и False в противном случае.
- FlagRovnoe - проверяет, является ли число ровным, и возвращает True, если это так, и False в противном случае.
- DecSt - функция, которая принимает строку и количество цифр, которые нужно удалить, и возвращает новую строку, в которой указанное количество цифр заменено на предыдущую цифру.
- Основная часть программы:
В основной части программы выполняются следующие действия:
- Создаются текстовые файлы для ввода и вывода данных.
- Считывается строка из файла для ввода.
- В цикле, пока не выполнены условия для ровного числа, программа генерирует новую строку, удаляя одну цифру за раз, и проверяет, является ли она ровным числом.
- Если условие для ровного числа выполнено, в файл для вывода записывается
-1
, иначе записывается само число.
- Переменные:
В коде определены следующие переменные:
- f, f0 - файлы для ввода и вывода данных.
- St - строка, в которой проверяется наличие ровного числа.
- L, i - переменные для хранения количества цифр в строке и текущего индекса.
- Ошибки и оптимизации:
В коде есть некоторые потенциальные проблемы и места для оптимизации:
- Нет обработки ошибок, таких как отсутствие файла для ввода или недостаток памяти для создания новой строки.
- Цикл может выполняться очень долго, если число очень большое. Можно оптимизировать, используя более эффективный алгоритм проверки на ровное число.
- Нет проверки на переполнение при удалении цифр из строки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д