uva 1586 - Molar mass

这题的地址
这题明显没有1585那么水,果然就卡了我很久(主要我太菜);
开始思路就是字符串每个位置判断是数字还是字母,因为数组每一位都只能存一位,没考虑两位连续的数字怎么处理,卡了一下。后来想到写一个函数来求每个数字的大小。中间也遇到点小问题(主要自己太水了)

#include<iostream>
#include<cstring>
#include<iomanip>
#include<ctype.h>
#include<cstdio>
using namespace std;
#define M 201
char s[M];//以为初始化化都是自动0,没考虑每次初始化为0,导致后面memset()没写!结果wrong了两次
double ans[M];
int getnum(int pos,int len)
{
    int temp;
    for(int i=pos;i<len;i++)
   {
       if(isdigit(s[i]))//头文件<ctype.h>判断是否为数字。
          temp=i;
      else  break;
   }
    int num=0;
    for(int i=pos;i<=temp;i++)
    {
        num=num*10+(s[i]-'0');//求的这个字母元素到底有多少个。
    }
    return num-1;//体会是num-1,而不是num.

}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>s;
        double sum=0;
        memset(ans,0,sizeof(ans));//每次初始化,以后一定记得写这个!
        int len=strlen(s),flag=0;
        for(int i=0;i<len;i++)
        {
            if(s[i]=='C')ans[i]=12.01;
            if(s[i]=='H')ans[i]=1.008;
            if(s[i]=='O')ans[i]=16.00;
            if(s[i]=='N')ans[i]=14.01;
            if(isdigit(s[i])&&flag==0)
            {
                ans[i]=ans[i-1]*getnum(i,len);
                flag=1;//作用是遇到一次数字的第一位就求一次它好了,避免重复求,导致错误。
            }
            if(!isdigit(s[i]))
            {
                flag=0;//遇到字母就说明到下个元素了!
            }
        }
        for(int i=0;i<len;i++)
        {
            sum+=ans[i];
        }
        printf("%.3lf\n",sum);
    }
    return 0;
}

后记 :今晚以为可以刷很多紫书上的题目,结果还是被水题卡了。。。不过也幸运知道virtual judge可以做基本所有oj,uva做的实在有点坑点,以后去voj上做uva,加油咸鱼也要有梦!

你可能感兴趣的:(数字,ACM)