化学方程式

タイトルの説明

クラス102は毎日化学方程式を書いていますが、今では方程式を修正する方法を見つける必要があります。方程式内の反応物の順序は、間にスペースがあっても異なっていてもかまいません。降水量やガスの兆候、反応条件はありません。係数が正しくありません(添え字が間違っている場合、CO2がCO3の場合、係数も間違っています。同じ要素と異なる係数を持つ化学式は、反応物または生成物に表示されません。たとえば、COとCO2は反応物または生成物に一緒に表示されません。中央)、間違った化学式、反応物の欠如、両側の元素は保存されていません。

入力

最初の行にN、Mと入力します

長さNの文字列を2行目に正しい方程式として入力します

修正する方程式の3行目に長さMの文字列を入力します

アウトプット

正しい出力RIGHT

1行目にエラーWRONGが出力され、2行目にエラーの原因が出力されます(係数のみが正しくない場合は1、その他のエラーと3つ以上のエラーは2)。

入力例

34 29 
2Na OH + H2S O4 = Na 2 S O4 + 2H2O 
H2S O4 + 2NaO H = Na2 S O4 + 2H2O

出力例

正しい

プロンプト

34 25

2Na OH + H2S O4 = Na 2 SO4 + 2H2O

H2S O4
+ NaO H = 2H2O +2 K Cl

違う

2

1 <= N <= 100

1 <= M <= 100

コード

#pragma GCC optimize(1)
 #pragma GCC optimize(2)
 #pragma GCC optimize(3)
 #pragma GCC optimize( "Ofast")
#include <bits / stdc ++。h>
 #define rep(i、j、k)for (レジスタint i =(j); i <=(k); i ++)
 名前空間std を使用 ;
char a [ 1005 ]、b [ 1005 ]; 
ベクトル < 文字列 > ys1、ys2;
int fff、h1、h2; 
テンプレート < クラス T>インラインvoid read(T&x){ 
    x = 0 ; 
    登録char c = getchar(); 
    レジスターbool f = 0 ;
    while(!isdigit(c))f ^ = c == ' - '、c = getchar();
    一方、(isdigit(c)参照)、X = X * 10 + C - ' 0 '、C = GETCHAR()。
    if(f)x = -x; 
} 
string getnum(string s)
{ 
    string tmp = "" ;
    int len = s.length();
    forint i = 0; i <len; i ++ 
    { 
        if(s [i] <= ' 9 ' && s [i]> = ' 0 ' 
        { 
            tmp = tmp + s [i]; 
        } 
    } 
    return tmp; 
} 
string getchar(string s)
{ 
    string tmp = "" ;
    int len = s.length();
    forint i = 0 ; i <len; i ++ 
    { 
        if(s [i]> ' 9 ' || s [i] < '0 ' 
        { 
            tmp = tmp + s [i]; 
        } 
    } 
    return tmp; 
} 
bool check(char x)
{ 
    if(x <= ' 9 ' && x> = ' 0 ' trueを返す;
    if(x <= ' Z ' && x> = ' A ')はtrueを返し ますif(x <= ' z ' && x> = 'trueを返し ますif(x == '  ' || x == ' + ' || x == ' = ')はtrueを返し ますfalseを返し ます
} 
int main()
{ 
    string tmp = "" ; 
    gets(a); 
    gets(a); 
    gets(b); 
    int n = strlen(a);
    int m = strlen(b);
    forint i = 0 ; i <n; i ++ 
    { 
        if(fff == 0 && a [i]!= '  ')h1 + = a [i];
        if(a [i] == ' = ')fff = 1 ;
        if(check(a [i])!= 1続行;
        if(a [i] == ' + ' || a [i] == ' = ' 
        { 
            ys1.push_back(tmp); 
            tmp = "" ; 
        } 
        else  if(a [i]!= '  ' 
        { 
            tmp = tmp +a [i]; 
        } 
    } 
    if(tmp!= "" 
    { 
        ys1.push_back(tmp); 
    } 
    tmp = "" ; 
    fff = 0 ;
    forint i = 0 ; i <m; i ++ 
    { 
        if(fff == 0 && b [i]!= '  ')h2 + = b [i];
        if(b [i] == ' = ')fff = 1 ;
        if(check(b [i])!= 1続行;
        if(b [i] == ' + ' || b [i] == ' = ' 
        { 
            ys2.push_back(tmp); 
            tmp = "" ; 
        } 
        else  if(b [i]!= '  ' 
        { 
            tmp = tmp + b [i]; 
        } 
    } 
    if(tmp!= "" 
    { 
        ys2.push_back(tmp); 
        tmp = "" ; 
    } 
    sort(ys1.begin()、ys1.end()); 
    sort(ys2.begin()、ys2.end()); 
    もし(ys1 == ys2)
    { 
        if(h1 == h2)
        { 
            cout << " RIGHT " << endl;
            0を返し ます
        } 
    } 
    int c1 = 0、c2 = 0 ;
    if(ys1.size()!= ys2.size())
        c1 = 1、c2 = 1 ;
    else 
    { 
        n = ys1.size();
        forint i = 0 ; i <n; i ++ 
        {
            if(ys1 [i]!= ys2 [i])
            { 
                if(getnum(ys1 [i])!= getnum(ys2 [i]))
                    c1 = 1 ;
                if(getchar(ys1 [i])!= getchar(ys2 [i]))
                    c2 = 1 ; 
            } 
        } 
    } 
    cout << " WRONG " << endl;
    if(c1 == 1 && c2 == 0)cout << 1 << endl;
    それ以外の場合 cout << 2 << endl;
    帰る 0 ; 
}

おすすめ

転載: www.cnblogs.com/LJA001162/p/12678601.html