ACM UVA1586 Molar mass

#include <stdio.h>
#include <string.h>
#include <math.h>

#define W_C 12.01
#define W_H 1.008
#define W_O 16.00
#define W_N 14.01

int ToNum(char *s, int n)
{
	int sum = 0;
	if(n==0)
	{
		return sum = 1;	
	}

	else
	{
		for(int i=0; i<n; i++)
		{
			sum += (s[i]-'0')*pow(10, n-i-1);
		}		
	}
	return sum;
}

int main()
{
	int n;
	char num[81];
	memset(num, '0', sizeof(num));
	int cnum = 0;
	scanf("%d", &n);
	while(n--)
	{
		float W = 0;
		char s[81];
		scanf("%s", s);
		for(int i=0; i<strlen(s); i++)
		{
			if(s[i] == 'C')
			{
				for(int j = i; j<strlen(s); j++)
				{
					if(s[j+1]>'A' || j==strlen(s)-1)
					{
						W += W_C*ToNum(num, cnum);
						memset(num, '0', sizeof(num));
						cnum = 0;
						break;
					}
					else
					{
						num[cnum++] = s[j+1]; 
					}
					continue;
				}
			}
			if(s[i] == 'H')
			{
				for(int j = i; j<strlen(s); j++)
				{
					if(s[j+1]>'A' || j==strlen(s)-1)
					{
						W += W_H*ToNum(num, cnum);
						memset(num, '0', sizeof(num));
						cnum = 0;
						break;
					}
					else
					{
						num[cnum++] = s[j+1]; 
					}
					continue;
				}
			}
			if(s[i] == 'N')
			{
				for(int j = i; j<strlen(s); j++)
				{
					if(s[j+1]>'A' || j==strlen(s)-1)
					{
						W += W_N*ToNum(num, cnum);
						memset(num, '0', sizeof(num));
						cnum = 0;
						break;
					}
					else
					{
						num[cnum++] = s[j+1]; 
					}
					continue;
				}
			}
			if(s[i] == 'O')
			{
				for(int j = i; j<strlen(s); j++)
				{
					if(s[j+1]>'A' || j==strlen(s)-1)
					{
						W += W_O*ToNum(num, cnum);
						memset(num, '0', sizeof(num));
						cnum = 0;
						break;
					}
					else
					{
						num[cnum++] = s[j+1]; 
					}
					continue;
				}
			}					
		}
		printf("%.3f\n", W);
	}
	return 0;
}

简单题,其中ToNum函数是一个很好地将连续的字符串数字转化为相应数字的函数。

第一次做:2018.8.12

猜你喜欢

转载自blog.csdn.net/yestin_L/article/details/81612636