[アルゴリズム] 式の値を計算します
逆方法バラン または式ツリーを使用すると混乱して初心者になります.
これは読んで理解することですあなたが使用することができ、非常に単純な方法であり、
単純式には、 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グエン”. これは、アルゴリズムの設計が非常に短く、理解しやすいです, 学校の関数のパラメータのために非常によく働いた. イラストレーションコードパスカル.
このコードは、関数の値を計算するの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