8626 原子量计数
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\n",&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\n",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\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; }