码迷,mamicode.com
首页 > 其他好文 > 详细

NOIP2000普及组 T1计算器的改良

时间:2017-08-17 00:50:14      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:符号   抽象   输出   array   div   代码   解方程   bsp   style   

 

主要考字符串处理,把等式从等号中间断开,左边的区域为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.

 

NOIP2000普及组 T1计算器的改良

标签:符号   抽象   输出   array   div   代码   解方程   bsp   style   

原文地址:http://www.cnblogs.com/SJum/p/7376578.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!