⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 equal.pas

📁 vijos1003-等价表达式解题报告
💻 PAS
字号:
const
   m=5;
var
   sss:array[1..50] of longint;
   key:array[1..50] of longint;
   stack:array[1..50] of char;
   ss:string;
   a:array[1..m] of longint;
   i,j,k,n,t:longint;
   b:boolean;
procedure init;
   var
     i,k:longint;
   begin
     k:=0;
     for i:=1 to length(ss) do
       if ss[i]<>' ' then
         begin
           inc(k);
           ss[k]:=ss[i];
         end;
     delete(ss,k+1,50);
   end;
function operate(num1,num2:longint; op:char):longint;
   var
     num3:longint;
   begin
     if op='+' then num3:=num1+num2;
     if op='-' then num3:=num1-num2;
     if op='*' then num3:=num1*num2;
     if op='^' then
       begin
         num3:=1;
         for i:=1 to num2 do
           num3:=num3*num1 mod 10000;
       end;
     operate:=num3 mod 10000;
   end;
function calc(x:longint):longint;
   var
     i,top,num1,num2:longint;
     op:char;
     ts:string;
   begin
     i:=0; k:=0; top:=0;
     fillchar(sss,sizeof(sss),0);
     while i<length(ss) do
       begin
         inc(i);
         if (ss[i]>='0')and(ss[i]<='9') then
           begin
             inc(k);
             ts:=ss[i];
             while (i<length(ss))and(ss[i+1]>='0')and(ss[i+1]<='9') do
               begin
                 inc(i);
                 ts:=ts+ss[i];
               end;
             val(ts,sss[k]);
           end;
         if ss[i]='a' then
           begin
             inc(k);
             sss[k]:=x;
           end;
         if ss[i]='('   then
           begin
             inc(top);
             stack[top]:=ss[i];
           end;
         if (ss[i]='+')or(ss[i]='-')then
           begin
             while (top>0)and(stack[top]<>'(') do
               begin
                 op:=stack[top];
                 num2:=sss[k]; dec(k); num1:=sss[k];
                 sss[k]:=operate(num1,num2,op);
                 dec(top);
               end;
             inc(top);
             stack[top]:=ss[i];
           end;
         if ss[i]='*' then
           begin
             while (top>0)and(stack[top]<>'(')and(stack[top]<>'+')and(stack[top]<>'-') do
               begin
                 op:=stack[top];
                 num2:=sss[k]; dec(k); num1:=sss[k];
                 sss[k]:=operate(num1,num2,op);
                 dec(top);
               end;
             inc(top);
             stack[top]:=ss[i];
           end;
         if ss[i]='^' then
           begin
             while (top>0)and(stack[top]<>'(')and(stack[top]='^') do
               begin
                 op:=stack[top];
                 num2:=sss[k]; dec(k); num1:=sss[k];
                 sss[k]:=operate(num1,num2,op);
                 dec(top);
               end;
             inc(top);
             stack[top]:=ss[i];
           end;
         if ss[i]=')' then
           begin
             while stack[top]<>'(' do
               begin
                 op:=stack[top];
                 num2:=sss[k]; dec(k); num1:=sss[k];
                 sss[k]:=operate(num1,num2,op);
                 dec(top);
               end;
             dec(top);
           end;
       end;
     for i:=top downto 1 do
       begin
          op:=stack[i];
          num2:=sss[k]; dec(k); num1:=sss[k];
          sss[k]:=operate(num1,num2,op);
       end;
     if sss[1]>=0 then calc:=sss[1] else calc:=sss[1]+10000;
   end;
begin
   for i:=1 to m do a[i]:=i;
   readln(ss);
   init;
   for t:=1 to m do key[t]:=calc(a[t]);
   readln(n);
   for j:=1 to n do
     begin
       readln(ss);
       init;
       b:=false;
       for t:=1 to m do
         if key[t]<>calc(a[t]) then
           begin
             b:=true;
             break;
           end;
       if not b then write(chr(j+64));
     end;
   writeln;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -