【算法竞赛 入门经典】习题3-2 分子量(Uva1586)

一、题目

在这里插入图片描述
在这里插入图片描述

二、解题思路

题目比较长,抽象出来就是输入分子式然后求对应的摩尔质量。题目限制了只出现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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值