UVa 1586
程式碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define max 1000
char sub[100][100];
int main()
{
char s[max];
int T;
scanf("%d", &T);
while (T--)
{
scanf("%s", s);
memset(sub,0,sizeof(sub));
double sum = 0.0;
int length = strlen(s);
int j = 0,k = 0;
int flag = 0; //遇到一個字母后跟兩個數字或更多數字時,下標j只減一次
for (int i = 0; i < length; i++)
{
if (isupper(s[i]))
{
k = 0;
sub[j++][k] = s[i];
flag = 0;
}
else
{
if (flag == 0)
{
j--;
flag = 1;
}
k++;
sub[j][k] = s[i];
if (isupper(s[i + 1]))
j++;
}
}
for (int i = 0; i <= j; i++)
{
int k = 1;
int num = 0;
while (sub[i][k])
{
num *= 10;
num += sub[i][k] - '0';
k++;
}
if (num != 0)
{
if (sub[i][0] == 'C')
{
sum += 12.01 * num;
}
else if (sub[i][0] == 'H')
{
sum += 1.008 * num;
}
else if (sub[i][0] == 'O')
{
sum += 16.00 * num;
}
else if (sub[i][0] == 'N')
{
sum += 14.01 * num;
}
}
else
{
if (sub[i][0] == 'C')
{
sum += 12.01 ;
}
else if (sub[i][0] == 'H')
{
sum += 1.008 ;
}
else if (sub[i][0] == 'O')
{
sum += 16.00 ;
}
else if (sub[i][0] == 'N')
{
sum += 14.01 ;
}
}
}
printf("%.3f\n", sum);
}
return 0;
}