Written by Robert_Wang in Southwest University of Science And Technology.
给出一种物质的分子式(不带括号),求分子量。本题中的分子式只包含4种原子,分
别为C, H, O, N,原子量分别为12.01, 1.008, 16.00, 14.01(单位:g/mol)。例如,C6H5OH的
分子量为94.108g/mol。
分析:做一个函数,根据字母返回对应的分子量。在用一个计数器加上相应的分子量,如果遇到数字,则加上上一个字母的分子量的n-1倍,其中n是该数字
先看第一个算法:
#include<iostream>
#include<string.h>
#include<math.h>
#include<ctype.h>
using namespace std;
double f(char s)
{
if (s == 'C') return 12.01;
if (s == 'H') return 1.008;
if (s == 'O') return 16.00;
if (s == 'N') return 14.01;
return double(s - '0');
}
int main()
{
char s[122];
double c, h, o, n,sum;
c = h = o = n = sum =0;
cin >> s;
int len = strlen(s);
int i, j;
for (i = 0; i < len; i++)
{
if (isalpha(s[i])) { c = f(s[i]); sum += c; }
else {
for (j = 1; j < f(s[i]); j++)
{
sum += c;
}
}
}
cout << sum << endl;
return 0;
}
这样的算法当然可以,但是里面的循环有两个,而可以将其改为下面这种:
#include<iostream>
#include<string.h>
#include<math.h>
#include<ctype.h>
using namespace std;
double f(char s)
{
if (s == 'C') return 12.01;
if (s == 'H') return 1.008;
if (s == 'O') return 16.00;
if (s == 'N') return 14.01;
return double(s - '0');
}
int main()
{
char s[122];
double c, h, o, n,sum;
c = h = o = n = sum =0;
cin >> s;
int len = strlen(s);
int i, j;
for (i = 0; i < len; i++)
{
if (isalpha(s[i])) { c = f(s[i]); sum += c; }
else { sum += (f(s[i]) - 1)*c; }
}
cout << sum << endl;
return 0;
}
这样,算法的复杂度就为O(len),len是字符串的长度。