Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Алгоритмы
Курсы ККДП
Дистрибутивы
Ссылки

HotLog


 

Реализация на Pascal

type mystr=string[80];

var s1,s2,s,p:mystr;
    x,y,k:integer;

function search(var ch:char;s:mystr):integer;
var i,k : integer;
begin
  k:=0;
  for i:=length(s) downto 1 do begin
    if s[i]='(' then inc(k);
    if s[i]=')' then dec(k);
    if (k=0) and (s[i] in ['+','-','*']) then begin
      search:=i; ch:=s[i]; exit;
    end;
  end;
  search:=0;
end;

function calc(s:mystr):longint;
var i,j,k,c,l: integer;
    ok:boolean;
    ch: char;
begin
  l:=length(s);
  k:=0;
  ok:=true;
  for i:=1 to l do begin
    if s[i]='(' then inc(k);
    if s[i]=')' then dec(k);
    if (i>1) and (i<l) and (k=0) then ok:=false;
  end;
  if ok and (s[1]='(') and (s[l]=')') then begin
    calc:=calc(copy(s,2,l-2));
    exit;
  end else begin
    k:=search(ch,s);
    if k>0 then begin
      case ch of
        '+': calc:=calc(copy(s,1,k-1))+calc(copy(s,k+1,l-k));
        '-': calc:=calc(copy(s,1,k-1))-calc(copy(s,k+1,l-k));
        '*': calc:=calc(copy(s,1,k-1))*calc(copy(s,k+1,l-k));
      end;
      exit;
    end;
  end;
  val(s,k,l);
  calc:=k;
end;

procedure find(k:integer);
begin
  if k>length(s) then begin
    if x=calc(s) then p:=s;
  end else
  if s[k]=' ' then begin
    s[k]:='+'; find(k+1);
    s[k]:='-'; find(k+1);
    s[k]:='*'; find(k+1);
    s[k]:=' ';
  end
  else find(k+1);
end;

begin
  assign(input, 'input.txt'); reset(input);
  assign(output, 'output.txt'); rewrite(output);
  p:='';
  readln(s);
  while pos('  ',s)>0 do delete(s,pos('  ',s),1);
  if s[length(s)]=' ' then delete(s,1,length(s)-1);
  if pos('= ',s)>0 then delete(s,pos('= ',s)+1,1);
  if pos(' =',s)>0 then delete(s,pos(' =',s),1);
  if s[1]=' ' then delete(s,1,1);
  k:=pos('=',s);
  val(copy(s,1,k-1),x,y);
  s:=copy(s,k+1,length(s)-k);
  find(1);
  if p>'' then write(x,'=',p) else write(-1);
end.

Реализация на C++

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char s1[99],s2[99],s[99],p[99],*t;
int x;

long calc(char *l, char *r){
  int k=0,ok=1;
  char *t;
  for(t=l;t<=r;t++){
    if(*t=='(') k++;
    if(*t==')') k--;
    if(t>l && t<r && k==0) ok=0;
  }
  if(ok && *l=='(' && *r==')') return calc(l+1,r-1);
  k=0;
  for(t=r;t>=l;t--){
    if(*t=='(') k++;
    if(*t==')') k--;
    if(!k)
      switch(*t){
	case '+': return calc(l,t-1)+calc(t+1,r);
	case '-': return calc(l,t-1)-calc(t+1,r);
	case '*': return calc(l,t-1)*calc(t+1,r);
      }
  }
  return atol(l);
}

void find(int k){
  if(k==strlen(s)){
    if(x==calc(s,s+k-1)) strcpy(p,s);
  }else
  if(s[k]==' '){
    s[k]='+'; find(k+1);
    s[k]='-'; find(k+1);
    s[k]='*'; find(k+1);
    s[k]=' ';
  }else find(k+1);
}

int main(){
  freopen("input.txt","r",stdin);
  freopen("output.txt","w",stdout);

  gets(s);
  if(s[strlen(s)-1]=='\n') s[strlen(s)-1]=0;
  for(t=s;*t;t++)
    while(*t==' '&&((t[1]<48||t[1]>57)&&
	  (t>s&&(t[-1]==t[1]||t[1]==' '))||(t>s&&t[-1]=='='))) strcpy(t,t+1);
  x=atoi(s);
  strcpy(s,strstr(s,"=")+1);
  find(0);
  if(p[0]) printf("%d=%s",x,p);
      else printf("-1");

  return 0;
}


Красноярский краевой Дворец пионеров, (c)2006 - 2019, E-mail: admin@acmp.ru