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; }
相关文章推荐
- mac终端命令总结
- 1、梯度下降c代码
- 如何查看android应用签名文件的信息
- Redis 初学
- 当项目使用SpringMvc时拦截器的注意事项
- 修改UILable的字体位置
- 【牛刀小试】直接插入排序算法
- 几种常见的ROM,RAM初始化文件格式
- Python实现简单多线程任务队列
- Android中EditText输入框焦点从文字前面变成文字后面
- Spark SQL Example
- stringstream
- Leetcode 75. Sort Colors
- 问卷调查
- Spark SQL Example
- [bzoj3218]a + b Problem
- Java应用场景的解决框架资源大全
- 二维数组与指针总结
- iOS8和iOS9新特性的总结
- MyBatis(3.2.3) - hello world