习题3-2 分子量 UVa1586

算法竞赛入门经典(第2版)第3章 数组和字符串
习题3-2 分子量 UVa1586
感悟。
1、直接看英文原题的输入输出样例,在题意理解要求上省了许多力。

2、程序思路与习题3-1比较接近,但是调试花了很多时间,对于for循环中的i++有了更深的理解,下一次循环,i要自加1。

3、对将一个个数字拼成一个多位数的整数很有心得。

4、满心欢喜提交代码,WA,定睛一看输出多了g/mol,速改,之后AC。


附上代码

环境Dev-cpp4.9.9.2

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


char s[1000+10];
float value(char c){//根据不同的原子,获取相应的原子量 
    float v;
    switch(c){
        case 'C':
            v=12.01;
            break;
        case 'H':
            v=1.008;
            break;
        case 'O':
            v=16.00;
            break;
        case 'N':
            v=14.01;
            break;
    }
    return v;

int main(){
    int T;
    int len;
    int i;
    float sum;
    int m;
    int k;
    scanf("%d",&T);
    while(T--){
        sum=0;
        scanf("%s",s);
        len=strlen(s);
        for(i=0;i<len;i++){
            if(isalpha(s[i])){
                if(i+1<len){//获取相关原子个数
                    if(isdigit(s[i+1])){//下一个元素是数字 
                        k=1;
                        m=0;
                        while(i+k<len&&isdigit(s[i+k])){//单个数字连接成一个多位数的数字 
                            m*=10;
                            m+=s[i+k]-'0';
                            k++;
                        }
                        sum+=value(s[i])*m;
                        i=i+k-1;//重新开始,i要自加1,故先将i减1 
                    }else{//下一个元素是字母 
                        m=1;
                        sum+=value(s[i])*m;
                    } 
                }else{//下一个元素已越界 
                    m=1;
                    sum+=value(s[i])*m;
                }
                
            }
        }
        printf("%.3f\n",sum);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值