【OI】计算分子量 Molar mass UVa 1586 题解

题目:(由于UVa注册不了,还是用vjudge)

https://vjudge.net/problem/UVA-1586

详细说明放在了注释里面。原创。

破题点在于对于一个元素的组合(元素+个数),只有3种可能:

1、单个元素

2、一个元素和一位数字

3、一个元素和两位数字

没有了。因为题设交代了n<=99,表明个数只能为2位数。分别判断即可。

/*
Copyright 2019 AlexanderZ.Tang
Molar_mass.cpp
For UVa 1586
https://cnblogs.cn/nowonder
*/

#include <stdio.h>
#include <string.h>
#include <ctype.h>

const int num[] = {0,1,2,3,4,5,6,7,8,9};    //使用数组将字符数字转为数字,ch - ‘0‘即为该数字的下标
char s[80];        //储存字符串,n<=80 

double get_mass(char ch)
{
    //获得对应字符的分子量 

    if (ch==‘C‘)    return 12.01;
    if (ch==‘H‘)    return 1.008;
    if (ch==‘O‘)    return 16.00;
    if (ch==‘N‘)    return 14.01;
}

int main()
{
    int T;
    double sum;
    scanf("%d",&T);
    while (T--)    //计数器
    {
        sum = 0;
        scanf("%s",s);
        int len = strlen(s);
        if (len < 2)    //对于单个字符,直接输出,否则造成溢出
        {
            printf("%.3lf\n",get_mass(s[0]));
            continue;
        }

        for (int i=0;i<len-2;i++)    //防止溢出,从0到len-3
        {
            if (!isalpha(s[i]))    continue;    //数字跳过 

            if (!isalpha(s[i+1]))    //一个元素带一个数字(个位数)
            {
                if (!isalpha(s[i+2]))    //一个元素带两个数字(十位数)
                {
                    sum += get_mass(s[i]) * (num[s[i+1] - ‘0‘] * 10 + num[s[i+2] - ‘0‘]);
                }
                else
                {
                    sum += get_mass(s[i]) * num[s[i+1] - ‘0‘];
                }
            }
            else    //单独元素,直接算
            {
                sum += get_mass(s[i]);
            }
        }

        //字符串s中剩下两个字符
        //如果全是数字直接跳

        if (isalpha(s[len-2]))
        {
            if (!isalpha(s[len-1]))    //元素带个位数
            {
                sum += get_mass(s[len-2]) * num[s[len-1] - ‘0‘];
            }
            else    //单独元素
            {
                sum += get_mass(s[len-2]);
            }
        }

        if (isalpha(s[len-1]))    sum += get_mass(s[len-1]);    //最后一个字符
        printf("%.3lf\n",sum);    //输出
    }
    return 0;
}

原文地址:https://www.cnblogs.com/nowonder/p/Molar_mass.html

时间: 2024-10-19 11:16:26

【OI】计算分子量 Molar mass UVa 1586 题解的相关文章

分子量(Molar Mass,ACM/ICPC Seoul 2007,UVa 1586)

#include<stdio.h>#include<stdlib.h>#include<string.h>int main(){ char s[20]; scanf("%s", s); double sum = 0; for (int i = 0; i < strlen(s); i++) { if (s[i] == 'C') sum += (s[i + 1] - 48) * 12.01; if (s[i] == 'H') { if (s[i +

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 <

uva 1586 - Molar mass

在想更好的处理方法,现在却只能有这个糟烂的代码了--不好意思 #include<stdio.h> #include<string.h> #include<iostream> using namespace std; const int maxn=200; char s[maxn]; double ans[maxn]; int get_num(int pos,int len) { int temp; for(int i=pos;i<len;i++) { if(s[i

UVa 1586 / UVALive 3900 Molar mass (字符串)

Molar mass Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description An organic compound is any member of a large class of chemical compounds whose molecules contain carbon. The molar mass of an organic compo

分子量 UVA 1586

3900 - Molar mass Asia - Seoul - 2007/2008 An organic compound is any member of a large class of chemical compounds whose molecules contain carbon. The molar mass of an organic compound is the mass of one mole of the organic compound. The molar mass 

UVA1586 UVALive3900 Molar mass

Regionals 2007 >> Asia - Seoul 问题链接:UVA1586 UVALive3900 Molar mass.基础练习题,用C++语言编写程序. 这个问题是根据分子式,求分子量. 原子量使用map表来存储,所以用C++来编程. 程序中,使用函数getchar()处理输入流,需要更高的编程技巧. AC的C++语言程序如下: /* UVA1586 UVALive3900 Molar mass */ #include <iostream> #include <

分子量 (Molar Mass,ACM/ICPC Seoul 2007,UVa 1586)

解题思路: 1.将分子量用double 数组记录下来 2.将字符串存储在字符数组中,从头向后扫描,一直记住“字母”,对下一个字符进行判断,是否是数字,如果是数字:用一个整数记录,本代码中用的sum,同时下标++. 进行判断,查看是否对数字进行了记录,即查看sum是否进入了while循环并被赋值,如果没有被赋值,说明下一个字符不是数字,直接对W(总记录)值进行赋值,为当前字符的权值(分子量),即double数组的中的值.如果被赋值,说明字符后面是一个数字,sum中存放了该“数字”,也是对w赋值,不

(UVA)1586 --Molar Mass(分子量)

题目链接:http://vjudge.net/problem/UVA-1586 思路:统计一个分子式中CHON出现的总次数,乘上相对原子量后求和.要注意的是CH4这样的C后面的1默认不出现,以及C4H10这样的后面的数字是两位的情况. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 int main() 7 { 8 int t,len; 9

UVA 1586 Molar Mass (c++)(字符串处理)(模拟)

题目大意就是给一个只含有C/H/O/N四个字母的分子式,求分子量.跟着题目意思来进行模拟就好了.重点与难点在于如何处理字母后一位数字以上的数字.写得略显繁杂. #include <iostream> #include <string> #include <cstdio> #include <cstring> #define maxn 1000000+10 #include <ctype.h> using namespace std ; doubl