8626 原子量计数
时间限制:1000MS 内存限制:1000K
提交次数:218 通过次数:89
题型: 编程题 语言: G++;GCC
Description
给出一个化学原子式,仅含有C,H,O,N 四种元素,计算其总分子量。

例如,C6H5OH 的原子量为94.108g/mol,计算方法为: 6 × (12.01 g/mol) + 6 × (1.008 g/mol) +1 × (16.00 g/mol).
输入格式
输入的第一行是数字T,表示输入文件含有T个CASE。之后有T行,每行有一个长度小于100 的字符串, 表示要求的分子式。原子都用大写字母表示,没有括号,保证所有的式子都合法。
输出格式
输出每个式子的原子量。
输入样例
4 C C6H5OH NH2CH2COOH C12H22O11
输出样例
12.010 94.108 75.070 342.296
提示
来源
PKKJ @ 07 GIS 1
作者
admin
很简单的一道模拟题,代码不是很长,测试数据也并不坑人;直接上代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <math.h> 5 6 //using namespace std; 7 8 int main() 9 { 10 int T; 11 char s[200]; 12 int i,j,k,c,o,h,n; 13 scanf("%d ",&T); 14 for(i=0; i<T; i++) 15 { 16 c=0; 17 h=0; 18 n=0; 19 o=0; 20 k=0; 21 scanf("%s",s); 22 int len=strlen(s); 23 for(j=0; j<len; j++) 24 { 25 if(s[j]=='C') 26 { 27 k=j+1; int temp=0; 28 if(s[k]>='0'&&s[k]<='9') 29 while(s[k]>='0'&&s[k]<='9') 30 { 31 if(k>j+1) 32 temp=temp*10+s[k]-'0'; 33 else 34 temp+=s[k]-'0'; 35 k++; 36 } 37 else 38 temp++; 39 c+=temp; 40 } 41 42 else if(s[j]=='O') 43 { 44 k=j+1; int temp=0; 45 if(s[k]>='0'&&s[k]<='9') 46 while(s[k]>='0'&&s[k]<='9') 47 { 48 if(k>j+1) 49 temp=temp*10+s[k]-'0'; 50 else 51 temp+=s[k]-'0'; 52 k++; 53 } 54 else 55 temp++; 56 o+=temp; 57 58 } 59 else if(s[j]=='H') 60 { 61 k=j+1;int temp=0; 62 if(s[k]>='0'&&s[k]<='9') 63 while(s[k]>='0'&&s[k]<='9') 64 { 65 if(k>j+1) 66 temp=temp*10+s[k]-'0'; 67 else 68 temp+=s[k]-'0'; 69 k++; 70 } 71 else 72 temp++; 73 h+=temp; 74 75 76 } 77 else if(s[j]=='N') 78 { 79 k=j+1;int temp=0; 80 if(s[k]>='0'&&s[k]<='9') 81 while(s[k]>='0'&&s[k]<='9') 82 { 83 if(k>j+1) 84 temp=temp*10+s[k]-'0'; 85 else 86 temp+=s[k]-'0'; 87 k++; 88 } 89 else 90 temp++; 91 n+=temp; 92 93 94 } 95 } 96 double sum_c=12.010,sum_h=1.008,sum_o=16.000,sum_n=14.010; 97 double ans=c*sum_c+h*sum_h+o*sum_o+n*sum_n; 98 printf("%.3lf ",ans); 99 } 100 return 0; 101 }
下面是另一种方法:
#include <stdio.h>
#include <string.h>
int check(int temp[],int n);
int digit(char a);
int main()
{
int T;
scanf("%d",&T);
const double w_h=1.008,w_n=14.01,w_o=16.00,w_c=12.01;
while(T--)
{
char a[105];
int i,j,num_h=0,num_n=0,num_o=0,num_c=0;
double sum=0;
scanf("%s",a);
int alen=strlen(a);
//
{
int temp[20];
for(i=0;i<alen;i++)
{
if(a[i]=='H')
{
int n=0;
for(j=i+1;digit(a[j]);j++)
{
temp[n++]=a[j]-'0';
}
if(n==0)
{
n=1;
num_h+=n;
}
else
{
num_h+=check(temp,n);
}
}
}
}
{
int temp[20];
for(i=0;i<alen;i++)
{
if(a[i]=='N')
{
int n=0;
for(j=i+1;digit(a[j]);j++)
{
temp[n++]=a[j]-'0';
}
if(n==0)
{
n=1;
num_n+=n;
}
else
{
num_n+=check(temp,n);
}
}
}
}
{
int temp[20];
for(i=0;i<alen;i++)
{
if(a[i]=='O')
{
int n=0;
for(j=i+1;digit(a[j]);j++)
{
temp[n++]=a[j]-'0';
}
if(n==0)
{
n=1;
num_o+=n;
}
else
{
num_o+=check(temp,n);
}
}
}
}
{
int temp[20];
for(i=0;i<alen;i++)
{
if(a[i]=='C')
{
int n=0;
for(j=i+1;digit(a[j]);j++)
{
temp[n++]=a[j]-'0';
}
if(n==0)
{
n=1;
num_c+=n;
}
else
{
num_c+=check(temp,n);
}
}
}
}
sum=num_h*w_h+num_c*w_c+num_n*w_n+num_o*w_o;
printf("%.3lf
",sum);
}
return 0;
}
int check(int temp[],int n)
{
int i,sum=0,m=1;
for(i=n-1;i>=0;i--)
{
sum+=temp[i]*m;
m*=10;
}
return sum;
}
int digit(char a)
{
if(a<='9'&&a>='0')
return 1;
else return 0;
}