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
", sum);
    }


    return 0;
}
View Code
原文地址:https://www.cnblogs.com/tommychok/p/5343050.html