目录
概述
这是一道算法题。
题目是:给一串分子式,求它的相对分子质量
只含C,H,O,N
C=12.01 g/mol
H=1.008 g/mol
O=16.00 g/mol
N=14.01 g/mol例如:
输入
C
C2
C2H2
c2h3o5n6
输出
12.01
24.02
26.036
191.104
分析
首先需要分析一下这个问题。
在计算摩尔质量的时候,主要是挨个扫描,找到对应的质量,累加,当遇到数字的时候,需要累乘。那么可以得到如下编码步骤:
- 定义一个输入数组,从开始到结尾扫描。
- 区分字符和数字。
- 将结果累加起来。
简单的实现方式
简单的实现方式,是指实现的思想简单,但是代码较多。
逻辑如下:
- 开始扫描输入的数组,并挨个判断是字符还是数字。
- 遇见不为指定字母的,即为数字(那么此刻就出现了一个问题,就是例如c2,先计算了c,遇见2之后又将c*2,然后会发现,多计算了一个c,所以每次遇见数字,需要减去上一个字符)。
- 数字-'0'(ASCII相减,就能得到数字的ASCII,但是并没有将字符型数字,转化为整型数字)。
- 设置两个中间变量来计算,总的值(一个用于保存当前扫描的到数字,一个用于保存之前的字符,而结果就是数字*字符,而且中间变量每次计算完当前的,字符数字组合之后,都要置为0,否则之后就会累加,计算错误)。
- 打印最后结果。
#include <stdio.h>
#include <string.h>
int main()
{
double c=12.01,h=1.008,o=16.00,n=14.01,sum,temp1,temp2;//temp1存储数字,temp2存储数字前的字符 ;
int i;
char chem[100];
double ipt[100];//输入字符
sum=0;
scanf("%s",chem);
for(i=0;i<strlen(chem);i++)
{
if(chem[i]=='c')
{
sum=sum+c;
}
if(chem[i]=='h')
{
sum=sum+h;
}
if(chem[i]=='o')
{
sum=sum+o;
}
if(chem[i]=='n')
{
sum=sum+n;
}
else{
temp1=chem[i]-'0'; //存储数字
//(此时为什么要-0呢?因为0的ASCII为48,而字符类型的数字,与数字类型的数字刚好差48,当前此时也能自己写一个,字符型转数字型的方法来实现)
if(chem[i-1]=='c')
{
temp2 = c;
}
if(chem[i-1]=='h')
{
temp2 = h;
}
if(chem[i-1]=='o')
{
temp2 = o;
}
if(chem[i-1]=='n')
{
temp2 = n;
}
sum = temp1*temp2+sum-temp2;
temp1=0;
temp2=0;//每次结束之后将temp1和temp2的值置为0,以免后续累加
}
printf("第%d次sum值为%.3f\n",i,sum);
}
printf("%.3f\n",sum);
return 1;
}