NOIP2000普及组 T1计算器的改良

 

主要考字符串处理,把等式从等号中间断开,左边的区域为left,右边的区域为right。

开四个数组分别用来存储区域left和right中未知数的系数,区域left和right中的常数

先处理区域left,把区域left中含有未知数的数字和常数分别存储进数组,再处理区域right(字符串处理这里省略)

最后把存储区域left和right的未知数系数和常数的数组分别化简(合并同类项),进行平时解方程时候的模拟就好了。

主要看代码理解吧,思路讲的有点抽象了。

 

 1 var
 2         l_unk,r_unk,l_num,r_num:array[1..255] of longint;  //上面所说的四个数组
 3         top1 ,top2 ,top3 ,top4 :longint;  //四个数组的栈顶
 4         s,str:string;
 5         i,j:longint;
 6         unk:char;  //未知数的符号
 7         mid,last,value:longint;
 8 begin
 9         readln(s);
10         for i:=1 to length(s) do  //处理区域left
11         begin
12                 if s[i] in ['a'..'z'] then unk:=s[i];  //找出未知数
13                 if s[i]='=' then mid:=i;  //找出等式中间位置
14         end;
15         if s[length(s)]<>unk then
16                 s:=s+'+';
17         last:=1;
18         for i:=1 to mid do
19         begin
20                 if s[i]=unk then  //如果遇到未知数
21                 begin
22                         str:=copy(s,last,i-last);  //字符串处理
23                         val(str,value);  //字符串转数字
24                         inc(top1);
25                         l_unk[top1]:=value;  //进栈
26                         last:=i+1;
27                 end;
28                 if (not(s[i] in ['0'..'9'])) and (s[i]<>unk) and (i<>last) then  //如果遇到了常数
29                 begin
30                         str:=copy(s,last,i-last);  //字符串处理
31                         val(str,value);  //转数字
32                         inc(top3);
33                         l_num[top3]:=value;  //进栈
34                         last:=i;
35                 end;
36         end;
37         last:=mid+1;
38         for i:=mid+1 to length(s) do  //处理区域right
39         begin
40                 if s[i]=unk then  //   同上
41                 begin
42                         str:=copy(s,last,i-last);
43                         val(str,value);
44                         inc(top2);
45                         r_unk[top2]:=value;
46                         last:=i+1;
47                 end;
48                 if (not(s[i] in ['0'..'9'])) and (s[i]<>unk) and (i<>last) then
49                 begin
50                         str:=copy(s,last,i-last);
51                         val(str,value);
52                         inc(top4);
53                         r_num[top4]:=value;
54                         last:=i;
55                 end;
56         end;
57         for i:=top1-1 downto 1 do l_unk[i]:=l_unk[i]+l_unk[i+1];  //化简数组,合并同类项
58         for i:=top2-1 downto 1 do r_unk[i]:=r_unk[i]+r_unk[i+1];
59         for i:=top3-1 downto 1 do l_num[i]:=l_num[i]+l_num[i+1];
60         for i:=top4-1 downto 1 do r_num[i]:=r_num[i]+r_num[i+1];
61         l_unk[1]:=l_unk[1]-r_unk[1];  //解方程,左边未知数系数加上右边未知数的系数的相反数
62         r_num[1]:=r_num[1]-l_num[1];  //解方程,右边常数加上左边常数的相反数
63         writeln(unk,'=',r_num[1]/l_unk[1]:0:3);   //输出保留3位小数
64 end.

 

posted @ 2017-08-16 23:16  StupidJum  阅读(889)  评论(0编辑  收藏  举报