UVA1586 Molar Mess

Anorganiccompound  isanymemberofalargeclassofchem-

ical compounds whose molecules contain carbon. The  molar

mass ofanorganiccompoundisthemassofonemoleofthe

organiccompound. Themolarmassofanorganiccompound

can be computed from the standard atomic weights of the

elements.

When an organic compound is given as a molecular for-

mula,Dr. CHONwantstofinditsmolarmass.     Amolecular

formula,suchasC  H O ,identifieseachconstituentelementby

3

4 3

itschemicalsymbolandindicatesthenumberofatomsofeach

elementfoundineachdiscretemoleculeofthatcompound.     If

a molecule contains more than one atom of a particular ele-

ment,thisquantityisindicatedusingasubscriptafterthechemicalsymbol.

In this problem, we assume that the molecular formula is represented by only four elements, ‘C’

(Carbon),‘H’(Hydrogen),‘O’(Oxygen),and‘N’(Nitrogen)withoutparentheses.

Thefollowingtableshowsthatthestandardatomicweightsfor‘C’,‘H’,‘O’,and‘N’.

AtomicName

StandardAtomicWeight   12.01g/mol   1.008g/mol  16.00g/mol   14.01g/mol

Carbon

Hydrogen

Oxygen

Nitrogen

Forexample,themolarmassofamolecularformulaC      H OHis94.108g/molwhichiscomputedby

6

5

6×(12.01g/mol)+6×(1.008g/mol)+1×(16.00g/mol).

Givenamolecularformula,writeaprogramtocomputethemolarmassoftheformula.

Input

Yourprogramistoreadfromstandardinput.     TheinputconsistsofT   testcases. Thenumberoftest

cases T is given in the first line of the input. Each test case is given in a single line, which contains

a molecular formula as a string. The chemical symbol is given by a capital letter and the length of

the string is greater than 0 and less than 80. The quantity number n which is represented after the

chemicalsymbolwouldbeomittedwhenthenumberis1(2≤n≤99).


Output

Yourprogramistowritetostandardoutput.    Printexactlyonelineforeachtestcase.     Thelineshould

containthemolarmassofthegivenmolecularformula.

Sample Input

4

C

C6H5OH

NH2CH2COOH

C12H22O11

Sample Output

12.010

94.108

75.070

342.296 

简单的STL,用栈能够简单的解决,当然不用栈也行

//用了栈
#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
#define maxn 1000
using namespace std;
int main()
{
    int x;
    char s[maxn];
    scanf("%d",&x);
    while(x--)
    {
        scanf("%s",s);
        stack<float> st;
        int len=strlen(s),sum;
        float k;
        for(int i=0; i<len; i++)
        {
            if(s[i]=='C')
            {
                k=12.01;
                st.push(k);
            }
            else if(s[i]=='H')
            {
                k=1.008;
                st.push(k);
            }
            else if(s[i]=='O')
            {
                k=16.00;
                st.push(k);
            }
            else if(s[i]=='N')
            {
                k=14.01;
                st.push(k);
            }
            if(isdigit(s[i])&&(isalpha(s[i-1])))
            {
                sum=s[i]-'0';
                st.top()*=sum;
            }
            if((i>=1)&&isdigit(s[i])&&(isdigit(s[i-1])))
            {
                sum=s[i]-'0';
                st.top()*=10.0;
                st.top()+=(k*sum);
            }
        }
        int l=st.size();
        float sa=0.0;
        for(int i=0; i<l; i++)
        {
            sa+=st.top();
            st.pop();
        }
        printf("%.3f\n",sa);
    }
    return 0;
}
下边是模拟的栈

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define maxn 1000

float vec[maxn];
int fl=0;

int push(float k)
{
    fl++;
    vec[fl]=k;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(vec,0,sizeof(vec));
        fl=0;
        char s[maxn];
        scanf("%s",s);
        int i,l=strlen(s);
        float k,sum=0.0;
        for(i=0; i<l; i++)
        {
            if(s[i]=='C')
            {
                k=12.01;
                push(k);
            }
            else if(s[i]=='H')
            {
                k=1.008;
                push(k);
            }
            else if(s[i]=='O')
            {
                k=16.00;
                push(k);
            }
            else if(s[i]=='N')
            {
                k=14.01;
                push(k);
            }
            if(isdigit(s[i]) && isalpha(s[i-1]))
            {
                int tem=s[i]-'0';
                vec[fl]*=tem;
            }
            if((i>=1) && isdigit(s[i]) && isdigit(s[i-1]) )
            {
                int tem=s[i]-'0';
                vec[fl]*=10;
                vec[fl]+=(k*tem);
            }
        }
        for(i=1; i<=fl; i++)
        {
            sum+=vec[i];
        }
        printf("%.3f\n",sum);
    }
    return 0;
}



你可能感兴趣的:(stack,STL)