《算法竞赛入门经典》(第2版)习题 3-2 分子量

题目

分子量(Molar Mass, ACM/ICPC Seoul 2007, UVa1586)
给出一种物质的分子式(不带括号),求分子量。本题中的分子式只包含4种原子,分别为C,H,O,N,原子量分别为12.01,1.008,16.00,14.01(单位:g/mol)。例如,C6H5OH的分子量为94.108g/mol。

在UVa上的英文原题如下:
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 of an organic compound
can be computed from the standard atomic weights of the
elements.
When an organic compound is given as a molecular formula, Dr. CHON wants to find its molar mass. A molecular
formula, such as C3H4O3, identifies each constituent element by
its chemical symbol and indicates the number of atoms of each
element found in each discrete molecule of that compound. If
a molecule contains more than one atom of a particular element, this quantity is indicated using a subscript after the chemical symbol.
In this problem, we assume that the molecular formula is represented by only four elements, ‘C’
(Carbon), ‘H’ (Hydrogen), ‘O’ (Oxygen), and ‘N’ (Nitrogen) without parentheses.
The following table shows that the standard atomic weights for ‘C’, ‘H’, ‘O’, and ‘N’.
Atomic Name Carbon Hydrogen Oxygen Nitrogen
Standard Atomic Weight 12.01 g/mol 1.008 g/mol 16.00 g/mol 14.01 g/mol
For example, the molar mass of a molecular formula C6H5OH is 94.108 g/mol which is computed by
6 × (12.01 g/mol) + 6 × (1.008 g/mol) + 1 × (16.00 g/mol).
Given a molecular formula, write a program to compute the molar mass of the formula.

Input
Your program is to read from standard input. The input consists of T test cases. The number of test
cases T is given in the first line of the input. Each test case is given in a single line, which contains
a molecular formula as a string. The chemical symbol is given by a capital letter and the length of
the string is greater than 0 and less than 80. The quantity number n which is represented after the
chemical symbol would be omitted when the number is 1 (2 ≤ n ≤ 99).

Output
Your program is to write to standard output. Print exactly one line for each test case. The line should
contain the molar mass of the given molecular formula.

Sample Input
4
C
C6H5OH
NH2CH2COOH
C12H22O11

Sample Output
12.010
94.108
75.070
342.296

解题思路

我用string定义的变量来输入字符串,然后读取一个字符,判断并记录之后的原子个数(即数字)。在最后调试的时候,发现一个潜在的BUG,当字符下标遍历到最后一位时,i+1会越界,我就人工设置了一个结束符 ’ \0 '。

对了,还有一件事,关于string越界问题,我知道这个类的结尾是没有规定一定要有结束标志NULL,但是什么时候会越界还是有点不大清楚,具体自己可以查资料。我的思路有错误的话,欢迎指正!

AC代码(UVa的OJ)

#include <iostream>
#include <string>

using namespace std;

double operate(char c, int n) {
	double t = 0;
	if (c == 'C') t = 12.01;
	if (c == 'H') t = 1.008;
	if (c == 'O') t = 16.00;
	if (c == 'N') t = 14.01;
	return t * n;
}

int main() {
	int n;
	cin >> n;
	while (n--) {
		string ss;
		cin >> ss;
		int len = ss.length();
		ss[len] = '\0';	//人工给结尾添加一个结束符,防止后面i+1越界 
		double mass = 0;
		for (int i = 0; i < len+1; i++) {
			char c = ss[i];
			int sign = 0;	//标志数字的位数 
			int number = 1;	//原子数量,初始化为一个 
		
			for (; ss[i+1] >= '0' && ss[i+1] <= '9'; i++) {	 
				sign++;	//表示数字位数 
				if (sign == 1) number = ss[i+1] - '0';
				else number = number*10 + ss[i+1] - '0';	//若不是为一位数,则叠加 
			}
			mass += operate(c,number);
		}	
		printf("%.3lf\n", mass);
	}
	
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法竞赛是一个非常有趣和具有挑战性的领域,对于入门者来说,掌握一些经典习题是非常重要的。下面是一些算法竞赛入门经典习题的讲解: 1. 两数之和:给定一个整数数组和一个目标值,在数组中找出和为目标值的两个数。可以假设每个输入都只有一个解,并且同一个元素不能使用两次。这个问题可以使用哈希表来解决,时间复杂度为O(n)。 2. 最大子序和:给定一个整数数组,找到一个具有最大和的连续子数组。例如,对于数组[-2,1,-3,4,-1,2,1,-5,4],其最大子序和为6(子数组为[4,-1,2,1])。这个问题可以使用动态规划来解决,时间复杂度为O(n)。 3. 两数相加:给定两个非空链表,表示两个非负整数。它们每位数字都是按照逆序方式存储的,并且每个节点只能存储一位数字。将这两个数相加并以相同形式返回一个新的链表。例如,输入(2 -> 4 -> 3) + (5 -> 6 -> 4),输出7 -> 0 -> 8。这个问题可以使用链表的基本操作来解决,时间复杂度为O(max(m,n)),其中m和n分别是两个链表的长度。 4. 最长回文子串:给定一个字符串,找到其中最长的回文子串。例如,对于字符串"babad",最长的回文子串为"bab"或"aba"。这个问题可以使用动态规划或中心扩展法来解决,时间复杂度为O(n^2)。 5. 二叉树的最大深度:给定一个二叉树,找出其最大深度。最大深度是从根节点到最远叶子节点的最长路径上的节点数。例如,对于二叉树[3,9,20,null,null,15,7],其最大深度为3。这个问题可以使用递归来解决,时间复杂度为O(n),其中n是二叉树中的节点数。 以上是一些算法竞赛入门经典习题的讲解,希望能对你有所帮助。在算法竞赛中,不仅要熟悉各种经典题目的解法,还要注重实践和思考,提高自己的编程能力和算法思维。祝你在算法竞赛中取得好成绩!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值