Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program prak2( input, output );
- type
- list = ^zveno;
- zveno = record
- an: record
- a, n: integer;
- end;
- sl: list;
- end;
- var
- c: char;
- a, n: integer;
- h, p :list;
- fl1, fk, f, first, gotnull: boolean;
- procedure vvod ( var a, n: integer; var c: char; var fl1, f: boolean );
- begin
- a := 0;
- n := 0;
- if c = 'x' then
- begin
- a := 1
- end
- else
- begin
- f := ( c >= '1' ) and ( c <= '9' );
- while ( c <> 'x' ) and ( c <> '+' ) and ( c <> ' ' ) and ( c <> '-' ) and f do
- begin
- a := a * 10 + ord( c ) - ord( '0' );
- read( c );
- f := (( c >= '0' ) and ( c <= '9' )) or (( c in ['+', '-', ' ', 'x'] ))
- end;
- f := f and (not((a=1) and (c='x')))
- end;
- if f then
- begin
- if fl1 then
- begin
- a := -a
- end;
- if ( c = '+' ) or ( c = '-' ) or ( c = ' ' ) then
- begin
- n := 0
- end
- else
- begin
- read( c );
- if c = '^' then
- begin
- read( c );
- f := ( c >= '1' ) and ( c <= '9' );
- while ( c <> '+' ) and ( c <> ' ' ) and ( c <> '-' ) and f do
- begin
- n := n * 10 + ord( c ) - ord( '0' );
- read( c );
- f := ( c >= '0' ) and ( c <= '9' ) or ( c in ['+', '-', ' '] );
- end;
- f:=f and (n<>1)
- end
- else
- if c in ['+', '-', ' '] then
- begin
- n := 1
- end
- else
- begin
- f := false
- end
- end;
- fl1 := c = '-'
- end
- end;
- procedure inli ( p: list; a, n: integer; var ff: boolean );
- var
- h, f, htemp, ptemp: list;
- found:boolean;
- begin
- h := p;
- htemp:=p;
- ptemp:=p; found:=false; {
- while ( p <> nil ) and ( p^.an.n > n ) do
- begin
- h := p;
- p := p^.sl
- end; }
- while ( ptemp <> nil ) do
- begin
- if (ptemp^.an.n > n) then begin
- htemp := ptemp;
- ptemp := ptemp^.sl
- end else begin
- h:=htemp;
- p:=ptemp;
- ptemp:=nil;
- found:=true;
- end;
- end;
- if (not found) then begin
- h:=htemp;
- p:=nil;
- end;
- if (p=nil) then begin
- ff:=true;
- end else if p^.an.n <> n then begin
- ff:=true;
- end else ff:=false;
- {ff := (p=nil) or (p^.an.n <> n);}
- if ff then
- begin
- new( f );
- f^.an.a := a;
- f^.an.n := n;
- f^.sl := h^.sl;
- h^.sl := f
- end
- end;
- procedure ochistka (var p: list );
- begin
- if (p<>nil) then begin
- ochistka(p^.sl);
- dispose(p);
- end;
- end;
- procedure diff(p:list);
- var h:list;
- begin
- h := p^.sl;
- if h<>nil then begin
- if (h^.an.n=0) then begin
- p^.sl:=nil;
- dispose(h);
- h:=nil;
- end;
- while (h<>nil) do begin
- if (h^.an.n=0) then begin
- p^.sl:=nil;
- dispose(h);
- h:=nil;
- end else begin
- h^.an.a:=h^.an.a*h^.an.n;
- h^.an.n:=h^.an.n-1;
- end;
- p:=p^.sl;
- if (h<>nil) then h:=h^.sl;
- end;
- end;
- end;
- procedure outlist(p:list);
- begin
- p:=p^.sl;
- if (p=nil) then begin
- writeln(0);
- end else begin
- while(p<>nil) do begin
- if (p^.an.a<>1) then write(p^.an.a);
- if (p^.an.n=0) and (p^.an.a=1) then write(1);
- if (p^.an.n<>0) then begin
- write('x');
- if (p^.an.n<>1) then write('^',p^.an.n);
- end;
- if (p^.sl<>nil) then begin
- if (p^.sl^.an.a>0) then write('+');
- end;
- p:=p^.sl;
- end;
- writeln;
- end;
- end;
- begin
- c := '0';
- new( p );
- p^.sl := nil;
- p^.an.a := 0;
- p^.an.n := maxint;
- f := true;
- {fl1 := false;}
- fk := true;
- first:=true;
- gotnull:=false;
- while ( c <> ' ' ) and f and fk do
- begin
- read( c );
- if (c='0') then begin
- if (not first) then begin
- f:=false
- end else begin
- read(c);
- f:=false;
- if (c=' ') then gotnull:=true;
- end;
- end else begin
- if (first) then begin fl1:= c = '-'; first:=false end;
- vvod( a, n, c, fl1, f );
- inli( p, a, n, fk );
- end;
- end;
- if ( not f ) or ( not fk ) then
- begin
- if (gotnull) then writeln(0) else writeln( 'error' )
- end
- else
- begin
- h := p^.sl;
- first:=true;
- diff(p);
- outlist(p);
- end;
- end.
Add Comment
Please, Sign In to add comment