[アルゴリズム] 式の値を計算します
逆方法バラン または式ツリーを使用すると混乱して初心者になります.
これは読んで理解することですあなたが使用することができ、非常に単純な方法であり、
単純式には、 2 操作 + と *
最高経営責任者(CEO): 2*5+3+4*3+2
計算:
式が許可している場合 + 最初の正規表現を取る + 式の最後の部分
逆にした場合に発現が可能に * 最初の正規表現を取る * 終了式
逆に式は数自体を=
イラスト: “2*5+3+4*3+2” = “2*5″+”3+4*3+2” = 2 * 5 3 ”4*3+2″= 2 * 5 3 ”4*3″+2 = 2*5+3+4*3+2
式には、オペレーションを含む +, -, *
我々は表現フォーラムを計算するために追加する前に + 各記号の前に – (証拠がある場合 – その後、元に向かう)
許可なしに通常のように計算 –
式には、オペレーションを含む +, -, *, /
もっと + 前 –
もっと * 前 /
エラーがある場合列を数値に変換しながら、文字列の最初の文字を削除する - > 文字列を数値に変更していき、その後、逆を取る. 通常の計算式として進んでのみ + と *
あなたが記事で、このアルゴリズムを使用する場合, アルゴリズムqvluomの作者の名前を指定してください
コードで示され 4 操作 +, -, *, /
#include <sstream>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <string>
using namespace std;
int check_to_number(string s) //kiem tra la so
{
int check = 1, l = s.length();
for (int i = 1; i<l; i++)
if (!isdigit(s[i]) && s[i] != '.') //duyt tu phan tu thu 2neu khong la so hoac thi check = 0
{
check = 0;
break;
}
if (s[0] == '-' && check == 1) return 2; //kiem tra dau xau co la -
if (s[0] == '/' && check == 1) return 3; //kiem tra dau xau co la /
if (isdigit(s[0]) && check == 1) return 1; //dau xau la so
}
float convert_to_number(string s)
{
float number, check = check_to_number(s);
if (check > 0)
{
if (check == 1) //neu la so binhf thuong
{
stringstream ss (s);
ss >> number;
}
if (check > 1)
{
stringstream ss (s.substr(1,s.length()-1));
ss >> number;
if (check == 2) number = 0 - number; //neu la phep tru
if (check == 3) number = 1/number; // neu la phep chia
}
return number;
}
}
float process(string s, int l, int r)
{
int li = 0, ri = r;
if (check_to_number(s)) return convert_to_number(s); //{ cout <<" "<<convert_to_number(s)<<endl; return convert_to_number(s);}
else
{
int i;
for (i=li; i<ri; i++) if (s[i] == '+') return process(s.substr(li, i-li), li, i) + process(s.substr(i+1, ri-i), i+1, ri-i);
for (i=li; i<ri; i++) if (s[i] == '*') return process(s.substr(li, i-li), li, i) * process(s.substr(i+1, ri-i), i+1, ri-i);
}
return 0;
}
int main()
{
float number;
string s;
getline(cin,s);
for (int i=0; i<s.length(); i++)
{
if(s[i] == '-') { s.insert(i,"+"); i++; }
if(s[i] == '/') { s.insert(i,"*"); i++; }
}
cout<<s<<endl;
number = process(s,0,s.length());
cout<<number<<endl;
return 0;
}



qvluomによるこのアルゴリズム (QuachヴァンLượm) 提案年頃 2002 と広く奇妙な名前で公開されている “Quachグエン”. 正しい名前です “Quachグエン”. これは、アルゴリズムの設計が非常に短く、理解しやすいです, 学校の関数のパラメータのために非常によく働いた. イラストレーションコードパスカル.
function check(s:string):string; begin while pos('-',s)&gt;0 do s[pos('-',s)]:='$'; while pos('$',s)&gt;0 do begin insert('+',s,pos('$',s)); s[pos('$',s)]:='-'; end; while pos('/',s)&gt;0 do s[pos('/',s)]:='$'; while pos('$',s)&gt;0 do begin insert('*',s,pos('$',s)); s[pos('$',s)]:='/'; end; if s[1]='+' then delete(s,1,1); check:=s; end; function value(s:string):real; var r:real; c:word; begin if pos('+',s)&lt;&gt;0 then value:= value(copy(s,1,pos('+',s)-1))+ value(copy(s,pos('+',s)+1, length(s)-pos('+',s))) else if pos('*',s)&lt;&gt;0 then value:= value(copy(s,1,pos('*',s)-1))* value(copy(s,pos('*',s)+1, length(s)-pos('*',s))) else begin val(s,r,c); if c&lt;&gt;0 then if s[1]='-' then r:=-value(copy(s,2,length(s)-1)) else case upcase(s[c]) of '/': r:=1/value(copy(s,2,length(s)-1)); 'L': r:=ln(value(copy(s,3,length(s)-2))); end; value:=r; end; end; begin write(value(check('1+6/2*3-ln10')):0:3); readln; end.このコードは、関数の値を計算するのLn; 操作 +, -, *, /. 正弦の追加, とともに, そう, … 非常に簡単です.
まさにそう, コメントありがとうございました.
小さな問題を持つCコード, あなたは式を入力するとき (20+9)*(18+2)-1234/5, 結果は 333.2 しかし、あなたのプログラムアウト 246.8, あなたがあなたの助けを見直します, あなたの部門では、彼の問題を抱えているようです
AH, ありがとう. あなたの表現がサインを含む、あなたの表現のために残念になることは事実であります ( と ). あなたのプログラムは表現だけ、このような式で計算することができません 4 操作 +, -, *, / 一服.
bạn giải hộ mình câu 24+25+26+27+…+122+123