您的位置:首页 > 其它

8626 原子量计数

2016-02-27 10:46 387 查看

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

 

  很简单的一道模拟题,代码不是很长,测试数据也并不坑人;直接上代码:

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

//using namespace std;

int main()
{
int T;
char s[200];
int i,j,k,c,o,h,n;
scanf("%d\n",&T);
for(i=0; i<T; i++)
{
c=0;
h=0;
n=0;
o=0;
k=0;
scanf("%s",s);
int len=strlen(s);
for(j=0; j<len; j++)
{
if(s[j]=='C')
{
k=j+1; int temp=0;
if(s[k]>='0'&&s[k]<='9')
while(s[k]>='0'&&s[k]<='9')
{
if(k>j+1)
temp=temp*10+s[k]-'0';
else
temp+=s[k]-'0';
k++;
}
else
temp++;
c+=temp;
}

else if(s[j]=='O')
{
k=j+1; int temp=0;
if(s[k]>='0'&&s[k]<='9')
while(s[k]>='0'&&s[k]<='9')
{
if(k>j+1)
temp=temp*10+s[k]-'0';
else
temp+=s[k]-'0';
k++;
}
else
temp++;
o+=temp;

}
else if(s[j]=='H')
{
k=j+1;int temp=0;
if(s[k]>='0'&&s[k]<='9')
while(s[k]>='0'&&s[k]<='9')
{
if(k>j+1)
temp=temp*10+s[k]-'0';
else
temp+=s[k]-'0';
k++;
}
else
temp++;
h+=temp;

}
else if(s[j]=='N')
{
k=j+1;int temp=0;
if(s[k]>='0'&&s[k]<='9')
while(s[k]>='0'&&s[k]<='9')
{
if(k>j+1)
temp=temp*10+s[k]-'0';
else
temp+=s[k]-'0';
k++;
}
else
temp++;
n+=temp;

}
}
double sum_c=12.010,sum_h=1.008,sum_o=16.000,sum_n=14.010;
double ans=c*sum_c+h*sum_h+o*sum_o+n*sum_n;
printf("%.3lf\n",ans);
}
return 0;
}

 

下面是另一种方法:

#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\n",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;
}

  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: