题目:(由于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;
}

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

  1. Molar mass UVA - 1586

    ​ An organic compound is any member of a large class of chemical compounds whose molecules contain c ...

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

    #include<stdio.h>#include<stdlib.h>#include<string.h>int main(){ char s[20]; scanf ...

  3. UVa 1586 Molar mass --- 水题

    UVa 1586 题目大意:给出一种物质的分子式(不带括号),求分子量.本题中分子式只包含4种原子,分别为C.H.O.N, 原子量分别为12.01,1.008,16.00,14.01 解题思路:先实现 ...

  4. 分子量 (Molar Mass,ACM/ICPC Seoul 2005,UVa1586)

    习题 3-3 分子量 (Molar Mass,ACM/ICPC Seoul 2005,UVa1586) 给出一种物质的分子式(不带括号),求分子量.本题中的分子式只包含4种原子,分别为C,H,O,N, ...

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

    解题思路: 1.将分子量用double 数组记录下来 2.将字符串存储在字符数组中,从头向后扫描,一直记住“字母”,对下一个字符进行判断,是否是数字,如果是数字:用一个整数记录,本代码中用的sum,同 ...

  6. UVa 1586 Molar mass

    题意:给出物质的分子式,计算它的相对原子质量 因为原子的个数是在2到99之间的,所以找出一个是字母之后,再判断一下它的后两位就可以找出这种原子的个数了 #include<iostream> ...

  7. 【习题 3-2 UVA - 1586】Molar mass

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟. 主要是找那个数字. [代码] #include <bits/stdc++.h> using namespace ...

  8. UVa 1586 - Molar Mass - ACM/ICPC Seoul 2007 - C语言

    关键在于判断数字是两位数还是单位数,其他部分没有难度. #include"stdio.h" #include"string.h" #include"c ...

  9. uva 1586 Molar mass(Uva-1586)

    这题做的相当的复杂...之前做的现在应该能简单一点了写的. 我的代码: #include <bits/stdc++.h> using namespace std; main() { int ...

随机推荐

  1. chromium调试技巧

    调试技巧: 1.多进程不方便跟踪渲染进程,单渲染进程的设置方法     command_line->AppendSwitchWithValue("--renderer-process- ...

  2. moco模拟接口具体操作

    1.get请求 [ { "description": "模拟一个没有参数的get请求", "request": { "uri&qu ...

  3. comm tools

    RTL:寄存器传输级别 LRM:语言参考手册 FSM:有限状态机 EDIF:电子数据交换格式 LSO:库搜索目录 XCF:XST 约束条件 1. par -ol. high  命令总是 '-'开头,参 ...

  4. SQL 练习33

    查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名 SELECT Student.SId,Student.Sname,Cname,score from Student,Course,S ...

  5. 使用msp432搭建的平衡小车(一)

    1.前言 笔者是一名大二学生曾经荒废一年学业,现在不断学习,所以有任何问题都希望讨论提出,你们的支持就是我的动力. 关于硬件搭建的步骤,笔者就不提网上方案太多了,笔者使用编码器电机,驱动采用tb661 ...

  6. vue路由history模式,nginx配置

    nginx配置内容 # For more information on configuration, see: # * Official English Documentation: http://n ...

  7. C# 中的反射机制

    C# 中的反射 首先我们通过两个实例来说明反射的大体概念.B超:大家体检的时候大概都做过B超,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内发射 ...

  8. 十七:使用JDBC处理MySQL大数据

    一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...

  9. C#设计模式---观察者模式(Observer Pattern)

    一.目的 提供一种一对多的关系,当主题发生变化时候,可以通知所有关联的对象. 二.定义 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通 ...

  10. Java编码的问题

    <转> 由于JDK是国际版的,在编译的时候,如果我们没有用-encoding参数指定我们的Java源程序的编码格式,则javac.exe首先获得我们操作系统默认采用的编码格式,也即在编译j ...