这一道化学方程式,我的思路是这个式子分为3种,一种是类似于C(什么数字都没有),第二种是类似于C6H5OH(只有一位数),第三种是类似于C12H22O11(有两位数字的)。
于是我先从最后开始判断,看这个是否是'C'||'H'||'N'||'O',是的话直接计数,不是的话字母那他就是数字,然后在此基础上判断前一个数是数字还是字母即可。这里要注意两点:(1.)当他是第二种或者第三种情况的话,那么i的值要注意【for(int i=strlen(i)-1;i>=0;i--) i是要变化的,如果是第二种那么i=i-1,如果是第三种那么i=i-2,这里不懂的话可以根据我的代码来理解】
(2)c12的意思是有12个c,那么这里不是直接c1+=12*c1; 要c1+=12*c1-'0';
ok了分析完毕,附上代码:
#include<stdio.h> #include<string.h> int main() { int n,i; double sum; char s[101]; scanf("%d",&n); while(n--) { int C1=0,H1=0,O1=0,N1=0; scanf("%s",&s); sum=0; for(i=strlen(s)-1; i>=0; i--) { if(s[i]=='C') { C1++; continue; } if(s[i]=='H') { H1++; continue; } if(s[i]=='O') { O1++; continue; } if(s[i]=='N') { N1++; continue; } if(s[i]>='1'&&s[i]<='9') { if(s[i-1]=='C') { C1+=s[i]-'0'; i=i-1; continue; } if(s[i-1]=='H') { H1+=s[i]-'0'; i=i-1; continue; } if(s[i-1]=='O') { O1+=s[i]-'0'; i=i-1; continue; } if(s[i-1]=='N') { N1+=s[i]-'0'; i=i-1; continue; } if(s[i-1]>='1'&&s[i-1]<='9') { if(s[i-2]=='C') { C1+=(s[i-1]-'0')*10+s[i]-'0'; i=i-2; continue; } if(s[i-2]=='H') { H1+=(s[i-1]-'0')*10+s[i]-'0'; i=i-2; continue; } if(s[i-2]=='O') { O1+=(s[i-1]-'0')*10+s[i]-'0'; i=i-2; continue; } if(s[i-2]=='N') { N1+=(s[i-1]-'0')*10+s[i]-'0'; i=i-2; continue; } } } } sum=C1*12.01+H1*1.008+O1*16.00+14.01*N1; printf("%.3lf\n",sum); } return 0; }
这个代码有点长哈,我之后去借鉴一下别人的代码然后再来修改一下。
来了来了,这个代码真的很短啊,而且比我的简明的多:
#include<stdio.h> #include<ctype.h> double cost[]={0,0,12.01,0,0,0,0,1.008,0,0,0,0,0,14.01, 16.00,0,0,0,0,0,0,0,0,0,0,0}; int main() { int n; char x[100]; scanf("%d",&n); while(n--) { int n,lastx; double sum=0; scanf("%s",x); for(int i=0;x[i]!='\0';i++) { if(isalpha(x[i]))//这个函数get到了 { lastx=x[i]-'A';//这样的话就不用判断他是四个中的哪一个,粗暴简单,棒 sum=sum+cost[lastx]; } else { n=x[i]-'0'; if(x[i+1]>='0'&&x[i+1]<='9') { n=n*10+x[i+1]-'0'; i++; } sum=sum+(n-1)*cost[lastx]; } } printf("%.3f\n",sum); } return 0; }