【算法竞赛 入门经典】习题3-2 分子量(Uva1586)
程序员文章站
2022-04-08 09:17:39
...
一、题目
二、解题思路
题目比较长,抽象出来就是输入分子式然后求对应的摩尔质量。题目限制了只出现C\H\O\N四种元素,且每种元素的个数不超过99。所以题目的重点在于统计分子式中各元素出现的个数。
需注意的是元素个数为1时分子式中省略1,元素个数可能为两位数。
三、代码
#include<stdio.h>
#include<string.h>
#include<ctype.h> //isdigit函数的头文件,用于判断字符是否为'0'~'9'
using namespace std;
int main(){
double w[4]={12.01,1.008,16.00,14.01};//用于存储C、H、O、N的摩尔质量
double sum;
int num[4];//用于统计各元素的个数
char s[85];
int T;
scanf("%d",&T);
while(T--){
sum=0; //注意置零
memset(num,0,sizeof(num));//注意置零
scanf("%s",s);
for(int i=0;i<strlen(s);i++){
if(s[i]=='C'){
if(isdigit(s[i+1]) && isdigit(s[i+2])){
num[0]+=(s[i+1]-'0')*10+(s[i+2]-'0');//元素个数为两位数情况
}else{
num[0]+=isdigit(s[i+1])?(s[i+1]-'0') : 1;//元素个数是个位数,且考虑个数为1 情况
}
}
if(s[i]=='H'){
if(isdigit(s[i+1]) && isdigit(s[i+2])){
num[1]+=(s[i+1]-'0')*10+(s[i+2]-'0');
}else{
num[1]+=isdigit(s[i+1])?(s[i+1]-'0') : 1;
}
}
if(s[i]=='O'){
if(isdigit(s[i+1]) && isdigit(s[i+2])){
num[2]+=(s[i+1]-'0')*10+(s[i+2]-'0');
}else{
num[2]+=isdigit(s[i+1])?(s[i+1]-'0') : 1;
}
}
if(s[i]=='N'){
if(isdigit(s[i+1]) && isdigit(s[i+2])){
num[3]+=(s[i+1]-'0')*10+(s[i+2]-'0');
}else{
num[3]+=isdigit(s[i+1])?(s[i+1]-'0') : 1;
}
}
}
for(int i=0;i<4;i++){
sum+=(w[i]*num[i]);
}
printf("%.3lf\n",sum);
}
return 0;
}
上一篇: 关于斐波那契数列引发的一系列思考