我们知道,对于一道模拟题,需要用计算机来解决,说明其中有操作相同的组成部分,我们称之为阶段。我们人工对每一个阶段给定操作进行处理,然后让计算机对不同阶段进行枚举或者说循环。遇到这种题的时候一定要分清阶段是什么,阶段里的内容和操作是什么,一定一定不要混淆相邻阶段之间的操作!!!对于此题来说,每一阶段就是一个元素和它后面可能跟着的数组,所以一次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 ",&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 ",ans); 38 } 39 return 0; 40 }