Правильно расставить арифметические знаки в выражении - 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.

Объяснение кода листинга программы

  1. В программе объявлены три переменные типа vector: a, b и s.
  2. В процедуре readvector считывается n чисел из стандартного ввода и записывается в массив a.
  3. В процедуре init устанавливаются значения b в соответствии с правилами задачи.
  4. В процедуре findans выполняется поиск ответа на задачу. Если в массиве a есть подмассив, который равен s, то соответствующий элемент в массиве b устанавливается в true. Если такого подмассива нет, то выполняется поиск подмассива, который равен -s. Если такой подмассив найден, то соответствующий элемент в массиве b устанавливается в false. Флаг flag используется для контроля поиска.
  5. В процедуре writeans записываются числа из массива a и значения b в стандартный вывод. Если в массиве b есть элементы, которые равны true, то перед числом записывается знак +, если не равны true, то перед числом записывается знак -.
  6. В основной части программы считывается число s из стандартного ввода, затем считывается массив a из стандартного ввода. Переменная flag устанавливается в true. Затем вызывается процедура findans с аргументами s и 1. Если в конце выполнения процедуры findans флаг flag не установлен в true, то выводится сообщение Incorrect data. В противном случае вызывается процедура writeans с аргументами a и b.

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


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

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

8   голосов , оценка 3.875 из 5
Похожие ответы