【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;
}
【OI】计算分子量 Molar mass UVa 1586 题解的更多相关文章
- Molar mass UVA - 1586
An organic compound is any member of a large class of chemical compounds whose molecules contain c ...
- 分子量(Molar Mass,ACM/ICPC Seoul 2007,UVa 1586)
#include<stdio.h>#include<stdlib.h>#include<string.h>int main(){ char s[20]; scanf ...
- UVa 1586 Molar mass --- 水题
UVa 1586 题目大意:给出一种物质的分子式(不带括号),求分子量.本题中分子式只包含4种原子,分别为C.H.O.N, 原子量分别为12.01,1.008,16.00,14.01 解题思路:先实现 ...
- 分子量 (Molar Mass,ACM/ICPC Seoul 2005,UVa1586)
习题 3-3 分子量 (Molar Mass,ACM/ICPC Seoul 2005,UVa1586) 给出一种物质的分子式(不带括号),求分子量.本题中的分子式只包含4种原子,分别为C,H,O,N, ...
- 分子量 (Molar Mass,ACM/ICPC Seoul 2007,UVa 1586)
解题思路: 1.将分子量用double 数组记录下来 2.将字符串存储在字符数组中,从头向后扫描,一直记住“字母”,对下一个字符进行判断,是否是数字,如果是数字:用一个整数记录,本代码中用的sum,同 ...
- UVa 1586 Molar mass
题意:给出物质的分子式,计算它的相对原子质量 因为原子的个数是在2到99之间的,所以找出一个是字母之后,再判断一下它的后两位就可以找出这种原子的个数了 #include<iostream> ...
- 【习题 3-2 UVA - 1586】Molar mass
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟. 主要是找那个数字. [代码] #include <bits/stdc++.h> using namespace ...
- UVa 1586 - Molar Mass - ACM/ICPC Seoul 2007 - C语言
关键在于判断数字是两位数还是单位数,其他部分没有难度. #include"stdio.h" #include"string.h" #include"c ...
- uva 1586 Molar mass(Uva-1586)
这题做的相当的复杂...之前做的现在应该能简单一点了写的. 我的代码: #include <bits/stdc++.h> using namespace std; main() { int ...
随机推荐
- Java的安装过程和开发环境
首先需要安装jdk(Java Development Kit开发工具包) 下载地址:https://www.oracle.com/java/technologies/javase-downloads. ...
- druid与知乎平台
背景 知乎作为知名中文知识内容平台,业务增长和产品迭代速度很快,如何满足业务快速扩张中的灵活分析需求,是知乎数据平台组要面临的一大挑战. 知乎数据平台团队基于开源的 Druid 打造的业务自助式的数据 ...
- msfvenom简介
写此文是因为网上资料杂乱,不方便查阅,辣眼睛 测试免杀的时候刚好用到这个功能,顺便写一下(0202年靠msfvenom生成的纯原生payload可以宣告死亡了,如果有查不出来的杀软可以退群了,这也叫杀 ...
- noip13
T1 一开始直接丢了个暴力走人50pts,然后开始打表找规律,啥也没找着,最后二十分钟突然看出来了什么,把 \(f_{n,m}\)式子列了一下,发现常数项没啥规律,最后五分钟,突然闪过一丝灵感,但是是 ...
- NOIP 模拟 9 斐波那契
题解 这是一道推规律的题. 首先,这道题送分不少,先考虑 \(70pts\),直接暴力 \(\mathcal O(n)\) 建边,\(\mathcal O(logn)\) 求 \(lca\) 其次对于 ...
- webpack编译遇到的问题:Error: Cannot find module 'webpack-cli/bin/config-yargs'
运行npm run dev遇到的问题:Error: Cannot find module 'webpack-cli/bin/config-yargs' // 当前package.json 文件 & ...
- 深层剖析鸿蒙轻内核M核的动态内存如何支持多段非连续性内存
摘要:鸿蒙轻内核M核新增支持了多段非连续性内存区域,把多个非连续性内存逻辑上合一,用户不感知底层的不同内存块. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列九 动态内存Dynamic Mem ...
- ingress-nginx-controller 部署以及优化
一.说明 本文使用的ingress-nginx v1.0 最新版本,v1.0 适用于 Kubernetes 版本 >= v1.19 小于这个版本的k8s集群,请降级ingress-nginx. ...
- 2、二进制安装K8s 之 部署ETCD集群
二进制安装K8s 之 部署ETCD集群 一.下载安装cfssl,用于k8s证书签名 二进制包地址:https://pkg.cfssl.org/ 所需软件包: cfssl 1.6.0 cfssljson ...
- wpf 中的 自定义控件的 binding
XMl 代码 --------------------------------------------------------------------------------------------- ...