Правильно расставить арифметические знаки в выражении - Turbo Pascal
Формулировка задачи:
Даны N целых чисел X1, X2, …, XN. Требуется расставить между ними знаки «+» и «-» так, чтобы значение получившегося выражения было равно заданному целому S.
Например
S=10
x1=15
x2=25
x3=30
Ответ:15+25-30=10
Рекурсивная процедура вроде правильная ,но как показать выражение с правильными знаками «+» и «-»
Решение задачи: «Правильно расставить арифметические знаки в выражении»
textual
Листинг программы
program task( input, output ); const n = 3; type vector = array[ 1..n ] of integer; ans = array[ 1..n ] of boolean; var a: vector; b: ans; s: integer; flag: boolean; procedure readvector( var a: vector ); var i: integer; begin for i := 1 to n do read( a[ i ] ); end; procedure init( var b: ans ); var i: integer; begin for i := 1 to n do b[ i ] := false; end; procedure findans( s, count: integer ); var x: integer; begin if count = n then if a[ n ] = s then b[ n ] := true else if a[ n ] = -s then b[ n ] := false else flag := false else begin b[ count ] := true; findans( s - a[ count ], count + 1 ); if not flag then begin flag := true; b[ count ] := false; findans( s + a[ count ], count + 1 ); end; end; end; procedure writeans( var a: vector; var b: ans ); var i: integer; begin for i := 1 to n do begin if b[ i ] = true then begin if not ( i = 1 ) then write( '+' ); end else write( '-' ); write( a[ i ] ); end; end; begin flag := true; read( s ); readvector( a ); init( b ); findans( s, 1 ); if not flag then writeln( 'Incorect data' ) else writeans( a, b ); end.
Объяснение кода листинга программы
- В программе объявлены три переменные типа
vector
:a
,b
иs
. - В процедуре
readvector
считываетсяn
чисел из стандартного ввода и записывается в массивa
. - В процедуре
init
устанавливаются значенияb
в соответствии с правилами задачи. - В процедуре
findans
выполняется поиск ответа на задачу. Если в массивеa
есть подмассив, который равенs
, то соответствующий элемент в массивеb
устанавливается вtrue
. Если такого подмассива нет, то выполняется поиск подмассива, который равен-s
. Если такой подмассив найден, то соответствующий элемент в массивеb
устанавливается вfalse
. Флагflag
используется для контроля поиска. - В процедуре
writeans
записываются числа из массиваa
и значенияb
в стандартный вывод. Если в массивеb
есть элементы, которые равныtrue
, то перед числом записывается знак+
, если не равныtrue
, то перед числом записывается знак-
. - В основной части программы считывается число
s
из стандартного ввода, затем считывается массивa
из стандартного ввода. Переменнаяflag
устанавливается вtrue
. Затем вызывается процедураfindans
с аргументамиs
и1
. Если в конце выполнения процедурыfindans
флагflag
не установлен вtrue
, то выводится сообщениеIncorrect data
. В противном случае вызывается процедураwriteans
с аргументамиa
иb
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д