这一道化学方程式,我的思路是这个式子分为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
#include
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
#include
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;
}