您的位置:首页 > 编程语言 > C语言/C++

UVA1586 分子量 元素下标任意位数版本

2017-11-09 01:44 393 查看
题目:给出一个只包含4种原子,分别为C,H,O,N,求分子量。原子量分别为12.01, 1.008, 16.00, 14.01.例如C6H5OH的分子量为94.108

分析:1.该题难点在于判断元素下标的提取(需要判断得知下标多少位数)。

   2.看过其他博客也有同样题目的解析,只是鄙人觉得不够全面,因为其无法满足元素下标3位数或更高位数。

代码如下:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

#include <math.h>

#define maxn 100

char s[maxn];

int num(char* b,int q)        //num函数用来计算元素下标的数值

{

    int tot=1;

    int digit=0;

    int p=q;

    while(1)

    {

        if(!isdigit(b[p]))break;

        tot++;

        p++;

    }

    for(int i=0;i<tot-1;i++)

    {

        digit+=(b[q+i]-'0')*pow(10,i);

    }

    if(digit==0)digit=1;

    return digit;

}

int sum(int* c,double* r)             //sum函数用来计算分子量

{

    double tot=0;

    for(int i=0;i<4;i++)

    {

        tot+=c[i]*r[i];

    }

    return tot;

}

int main()

{   int T;

    double arr[]={12.01,1.008,16.00,14.01};

    scanf("%d",&T);

    while(T--){

        scanf("%s",s);

        int n=strlen(s);

        int a[4];

        memset(a,0,sizeof(a));

        for(int i=0;i<n;i++)

        {

                if(s[i]=='C')

                    {

                        a[0]+=num(s,i+1);

                    }

                if(s[i]=='H')

                    {

                        a[1]+=num(s,i+1);

                    }

                if(s[i]=='O')

                    {

                        a[2]+=num(s,i+1);

                    }

                if(s[i]=='N')

                    {

                        a[3]+=num(s,i+1);

                    }

        }

        double ans=sum(a,arr);

        printf("%.3f\n",ans);

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva 刘汝佳 算法 c语言