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