UVA-1586 Molar mass(模拟)

![]()

我们知道,对于一道模拟题,需要用计算机来解决,说明其中有操作相同的组成部分,我们称之为阶段。我们人工对每一个阶段给定操作进行处理,然后让计算机对不同阶段进行枚举或者说循环。遇到这种题的时候一定要分清阶段是什么,阶段里的内容和操作是什么,一定一定不要混淆相邻阶段之间的操作!!!对于此题来说,每一阶段就是一个元素和它后面可能跟着的数组,所以一次while循环里处理的就是这一个阶段。(这种思想类似于 https://acm.uestc.edu.cn/problem/bilibili-acfun-and-more/description 这题)

这里还注意一波黑科技 isdigit是用来判断这个字符变量是否是个数字 isalpha是判断这个字符变量是否是字母,如果是大写字母返回1,如果是小写字母返回2,如果不是字母返回0

这几个函数都在 ctype.h头文件里

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 const int MAX=105;
 4 int t,ls;
 5 char s[MAX];
 6 double ans;
 7 double get(char c){
 8     if (c=='C') return 12.01;
 9     if (c=='H') return 1.008;
10     if (c=='O') return 16.00;
11     if (c=='N') return 14.01;
12 }
13 int main(){
14     freopen ("molar.in","r",stdin);
15     freopen ("molar.out","w",stdout);
16     int i,j;double zt,num;
17     scanf("%d\n",&t);
18     while (t--){
19         scanf("%s",s+1);
20         ls=strlen(s+1);
21         i=1;ans=0;
22         while (i<=ls){
23             if (isalpha(s[i])){
24                 zt=get(s[i]);
25                 num=0.0;
26                 i++;
27             }
28             if (isdigit(s[i])){
29                 while (i<=ls && isdigit(s[i])){
30                     num=num*10+s[i]-'0';
31                     i++;
32                 }
33                 ans+=num*zt;
34             }
35             else ans+=zt;
36         }
37         printf("%.3lf\n",ans);
38     }
39     return 0;
40 }

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。