UVa 1586 Molar mass --- 水题
UVa 1586
题目大意:给出一种物质的分子式(不带括号),求分子量。本题中分子式只包含4种原子,分别为C、H、O、N,
原子量分别为12.01,1.008,16.00,14.01
解题思路:先实现一个从字符型的数到整型的数的转换函数,再将输入的串从头到尾扫描,遇到字母,则进一步扫描后面的数字的区间,
再调用函数进行转换,再乘以其的原子质量,最后累加到sum中即可。
/* UVa 1586 Molar mass --- 水题 */ #include <cstdio> #include <cstring> #include <ctype.h> #include <map> using namespace std; char s[100]; map<char, double> m; /* @function:将区间[p, q)的数字转换成整型的数并返回 @param:左闭右开区间[p,q) @return:返回转换的结果 */ int fun(char* p, char* q){ //说明传进来 if (p >= q){ return 1; } int num = 0, term = 1; while (p < q){ num = num*10 + (*p-'0'); ++p; }//while(p q) return num; } int main() { #ifdef _LOCAL freopen("D:\\input.txt", "r", stdin); #endif //定义相应字母的映射值 m['C'] = 12.01; m['H'] = 1.008; m['O'] = 16.00; m['N'] = 14.01; int t; scanf("%d", &t); while (t--){ scanf("%s", s); int i = 0; double sum = 0.0; while (s[i] != 0){ //i处是字母 if (isalpha(s[i])){ int j = i + 1; //j指向下一位 while (isdigit(s[j])){ ++j; }//j一直+1直到j指向字母 //两个字母之间即为数据 [i+1, j)区间即表示数字 //注意也有可能字母之后立即跟上字母,此时i+1 = j, 因此函数需要返回1 int t = fun(s + i + 1, s + j); sum += t*m[s[i]]; i = j; } }//s[i] printf("%.3f\n", sum); } return 0; }