1. 程式人生 > >UVa-1586 Molar mass (分子量)

UVa-1586 Molar mass (分子量)

提交 index urn 如何 == cin 情況 temp turn

給出一種物質的分子式(不帶括號,僅包含最多四種原子C、H、O、N),求分子量。已知C,H,O,N的原子量分別為12.01,1.008,16.00,14.01。

輸入格式:一個整數T,後面跟T個分子式。

輸出格式:每一行一個分子量,保留三位小數。

具體見https://cn.vjudge.net/problem/uva-1586

解析:本題有一個難點,就是如何處理兩個字母相連以及以字母結尾的分子式的情況。我的辦法是構造一個新string,把應該補1的地方都補上1。處理這個string就簡單多了。

我的C++代碼如下(提交的時候沒有把cctype頭文件寫進去,isalpha函數竟然也能使用,不知道為什麽哦...):

 1
#include <iostream> 2 #include <string> 3 #include <cstdio> 4 using namespace std; 5 int main() //求分子量 6 { 7 const double m_c = 12.01, m_h = 1.008, m_o = 16.00, m_n = 14.01; 8 string mole; 9 int T; 10 cin >> T; 11 while (T--) 12 { 13 cin >> mole;
14 double signal = 0, M = 0; 15 string n, tem; 16 int index; 17 auto e = mole.end(); 18 for (auto b = mole.begin();b != e;++b)//負責給原分子式補上數字1,存入n中 19 { 20 n += *b; 21 if (e - b > 1 && isalpha(*b) && isalpha(*(b + 1)))n +=
1;//如果一個字母後面緊跟一個字母,要在中間補個1 22 else if (e - b == 1 && isalpha(*b))n += 1;//原式最後一個字符若為字母,則補1 23 } 24 e = n.end(); 25 for (auto b = n.begin();b != e;++b) 26 { 27 if (isalpha(*b)) 28 { 29 switch (*b) 30 { 31 case H:signal = m_h;break; 32 case O:signal = m_o;break; 33 case C:signal = m_c;break; 34 case N:signal = m_n;break; 35 default:break; 36 } 37 } 38 else //當讀到數字 39 { 40 int weishu = 0; //記錄這個數字的位數,以便跳躍 41 tem = tem.assign(b, e); //tem為一個從位置b到這個字符串末尾的string 42 index = stoi(tem); //StringToInt,從tem的第一個字符開始讀一個數字 43 int temp = index; 44 while (temp) 45 { 46 weishu++; 47 temp /= 10; 48 } 49 b += weishu - 1; //越到下一個字母之前,通過大for再遞增b,到下一個字母 50 M += signal * index; 51 } 52 } 53 printf("%.3f\n", M); 54 } 55 return 0; 56 }

UVa-1586 Molar mass (分子量)