NOIP2000普及组 T1计算器的改良
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.
以上是关于NOIP2000普及组 T1计算器的改良的主要内容,如果未能解决你的问题,请参考以下文章