UVa 1586

题目:UVa--1586

思路:将输入的字符串割分为元素符号与数字的集合(数字为1的默认不写),例如将C2H5OH分为C5,H5,O,H四个部分,接下来就是将这四部分进行统一处理了

统一处理方法:每一次先判断前面的元素符号到底是什么(主要是为了返回元素的相对原子质量进行后面的计算),然后通过后面的数字字符得到该原子的个数

#include<stdio.h>
#include<string.h>
#include<ctype.h>

double AtomicWeight(char c){
    if(c == 'C')
        return 12.010;
    else if(c == 'H')
        return 1.008;
    else if(c == 'O')
        return 16.000;
    else if(c == 'N')
        return 14.010;
}                   //判断元素符号并返回元素的相对摩尔质量

int main(){
    char a[85];
    int T;
    double ans;
    scanf("%d",&T);         //T个测试例
    while(T--){
        scanf("%s",a);
        int len = strlen(a);
        int i = 0;<span style="white-space:pre">		</span>//从第一个字符开始
        ans = 0;
        while(i < len){        
            double t = AtomicWeight(a[i]);          //判断元素符号并返回其相对原子质量
            int n;<span style="white-space:pre">				</span>   //原子个数
            if(isalpha(a[i+1])||a[i+1]=='\0'){
                n = 1;
                i++;
            }
            else{
                n  = 0;
                while(isdigit(a[i+1])){
                    n = 10*n + a[i+1] - '0';
                    i++;
                }
                i++;                    //保证处理的每部分都以元素符号开头
            }
            ans += (t*n);<span style="white-space:pre">		</span>//计算总分子质量
        }
        printf("%.3f\n",ans);  //结果保留三位小数

    }

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值