內容
大家還記得高一化學所學的概念嗎?所謂的簡式表示的就是原子的最簡單整數比,透過簡式我們可以求出該物質各成分的組成比例。相對的,分子式表示的就是一分子內所含各原子的真實數目。
比方說 : 經過簡單的數學推導,分子式$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。
0 Comments
張貼留言