內容 

大家還記得高一化學所學的概念嗎?所謂的簡式表示的就是原子的最簡單整數比,透過簡式我們可以求出該物質各成分的組成比例。相對的,分子式表示的就是一分子內所含各原子的真實數目。

比方說 : 經過簡單的數學推導,分子式$C_nH_n$可表為簡式CH,假設CH的分子量(又稱式量)為r,$C_nH_n$的分子量 = nr

你的任務很簡單,給予一道由C,H,O組成的分子式,請你輸出其分子量、簡式以及式量


輸入說明

有多筆測資

第一行輸入字串 $C_xH_yO_z$ ,為需要壓縮的分子式

其中, 2≤x,y,z≤99

輸出說明

針對每行輸入輸出三行

第一行輸出該分子式之分子量

第二行輸出該分子式之簡式

第三行輸出該分子式之式量


範例輸入

C2H6O2

C6H12O6

範例輸出

62

CH3O

31

180

CH2O

30


程式

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

int gcd2(int x, int y)
{
    if (y == 0) return x;
    else return gcd2(y,x%y);
}

vector<int> stoint(string s){
    vector<int> v;
    string t,ss = ",";
    int p;
    s.replace(0,1,""); //把C刪掉
    p = s.find("H");
    s.replace(p,1,ss); //把H換成,
    p = s.find("O");
    s.replace(p,1,ss); //把O換成,
    stringstream sss(s);
    while(getline(sss, t, ',')) {
        v.push_back(stoi(t));
    }
    return v;
}

int main()
{   
    int x,y,z,n;
    string s;
    while(cin>>s){
        vector<int> v = stoint(s);
        n = v[0]*12+v[1]+v[2]*16;
        cout<<n<<"\n";
        int gcd = gcd2(gcd2(v[0],v[1]),v[2]);
        x = v[0]/gcd;
        y = v[1]/gcd;
        z = v[2]/gcd;
        if(x == 1 && y == 1 && z == 1) cout<<"CHO\n";
        else if (x == 1 && y == 1) cout<<"CHO"<<z<<"\n";
        else if (x ==1 && z == 1) cout<<"CH"<<y<<"O\n";
        else if (y == 1 && z == 1) cout<<"C"<<x<<"HO\n";
        else if (x == 1) cout<<"CH"<<y<<"O"<<z<<"\n";
        else if (y == 1) cout<<"C"<<x<<"HO"<<z<<"\n";
        else if (z == 1) cout<<"C"<<x<<"H"<<y<<"O\n";
        else cout<<"C"<<x<<"H"<<y<<"O"<<z<<"\n";
        
        cout<<n/gcd<<"\n";
    }
    

    return 0;
}


說明

因為第一行輸入的分子式是字串,而我們需要獲得裡面的數字,stoint()就負責這項工作。利用getline()分割並存入vector裡,由於回傳值的型態是vector,所以函式的型態就必須是vector(有點像廢話,但當時我就錯在這裡😂)。

分子式的簡式,有認真上化學課的好學生會知道,簡式就是x,y,z除以它們的最大公因數。gcd2()可以求出兩個數的最大公因數,但是有x,y,z三個數,解決方式為先求x,y的最大公因數,然後再求x,y的最大公因數和z的最大公因數,就可得出x,y,z的最大公因數。

有認真上化學課的好學生也會知道分子量與式量如何求,C=12,H=1,O=16。