一开始想从后往前分析字符串,后来发现老老实实从前往后分析才好做。
这题不难,但是我提交了4次才ac。
好像用函数更快捷,不过我对函数不熟,看完下章再说。
#include<stdio.h>
#include<string.h>
#include<ctype.h>
char s[100];
int main()
{
int c[3],h[3],o[3],n[3],T;
double tot = 0.0;
scanf("%d", &T);
while(T--)
{
memset(c, 0, sizeof(c));
memset(h, 0, sizeof(h));
memset(o, 0, sizeof(o));
memset(n, 0, sizeof(n));
tot = 0;
scanf("%s", s);
int size = strlen(s);
for(int i = 0; i < size; i++)
{
//printf("%c", s[i]);
if(s[i] == 'C')
{
int len = 0;
//printf("1 len = %d s[%d] = %c c[1] = %d c[2] = %d\n",len,i,s[i],c[1],c[2]);
for(int j = 1; j<=2;j++)
{
if(isdigit(s[i+j])) len++;
else break;
}
if(!len) c[1]++;
else if(len == 1) c[1] += (s[i+1]-'0');
else if(len == 2)
{
c[2] = c[2] + (s[i+1]-'0');
c[1] = c[1] + (s[i+2]-'0');
}
i += len;
//printf("2 len = %d s[%d] = %c c[1] = %d c[2] = %d\n",len,i,s[i],c[1],c[2]);
}
else if(s[i] == 'H')
{
int len = 0;
for(int j = 1; j<=2;j++)
{
if(isdigit(s[i+j])) len++;
else break;
}
if(!len) h[1]++;
else if(len == 1) h[1] += (s[i+1]-'0');
else if(len == 2)
{
h[2] += (s[i+1]-'0');
h[1] += (s[i+2]-'0');
}
i += len;
}
else if(s[i] == 'O')
{
int len = 0;
for(int j = 1; j<=2;j++)
{
if(isdigit(s[i+j])) len++;
else break;
}
if(!len) o[1]++;
else if(len == 1) o[1] += (s[i+1]-'0');
else if(len == 2)
{
o[2] += (s[i+1]-'0');
o[1] += (s[i+2]-'0');
}
i += len;
}
else if(s[i] == 'N')
{
int len = 0;
for(int j = 1; j<=2;j++)
{
if(isdigit(s[i+j])) len++;
else break;
}
if(!len) n[1]++;
else if(len == 1) n[1] += (s[i+1]-'0');
else if(len == 2)
{
n[2] += (s[i+1]-'0');
n[1] += (s[i+2]-'0');
}
i += len;
}
}
c[0] = c[1]+c[2]*10;
h[0] = h[1]+h[2]*10;
n[0] = n[1]+n[2]*10;
o[0] = o[1]+o[2]*10;
//printf(" SIZEOf S IS %d\n", sizeof(s));
tot = 12.01*c[0]+1.008*h[0]+16.00*o[0]+14.01*n[0];
printf("%.3lf\n", tot);
//if(T) printf("\n");
}
return 0;
}