算法竞赛入门经典习题3-2
2018-03-14 13:42
190 查看
给出一种物质的分子式(不带括号),求分子量。本题中的分子式只包含4种原子,分别为C,H,O,N,分子量分别为12.01,1.008,16.00,14.01(单位:g/mol)。例如,C6H5OH的分子量为94.108g/mol。
这道题怎么说的乍一看简单的很,其实一看例子就知道了,如果字母后面没有数字呢?怎么判断,没有数字算作一个,在最后一个的话简单,如果是在中间出现这么一个字母,那么就要检测字母。
开干:
首先要知道数字的ACSII码,这样才能判断并且知道这个数到底是几。
当写到这里,你就一定知道了又一个陷阱,就是如果数字是两位数怎么办,三位数怎么办,还要一直判断下去么,怎么写才简单呢?
看了很多其他人的解法好多都是最多只判断到两位数那三位数四位数到底怎么办?
这么一道看似简单的题我却研究了好久好久,终于以位置为中心研究出来了。直接看代码吧
#include<stdio.h>
#include<string.h>
#include<ctype.h>
typedef struct Point{
char a;//字母
int b;//位置
}point;
double isch(char a){
if(a=='C') return 12.01;
else if(a=='H') return 1.008;
else if(a=='O') return 16.00;
else if(a=='N') return 14.01;
else return 0;
}
int main(){
char a[20];
double number=0.0;
int b[20],count=0;
point p[10];
memset(b,0,sizeof(b));
scanf("%s",a);
for(int i=0;i<strlen(a);i++){//记录每个字母出现的位置
if(a[i]>=65&&a[i]<=90){
p[count].a=a[i]; p[count].b=i;
count++;
}
}
for(int i=0;i<count-1;i++){
int x=p[i+1].b-p[i].b;
if((p[i].b+1)==p[i+1].b){
number=number+isch(p[i].a);
}else{
int y=1,z=0;
for(int k=1;k<x-1;k++) y=y*10;
for(int j=p[i].b+1;j<p[i].b+x;j++){
z=z+y*(a[j]-'0'); y=y/10;
}
number=number+isch(p[i].a)*z;
}
}
if((strlen(a)-1)==p[count-1].b){
number=number+isch(p[count-1].a);
}else{
int x=strlen(a)-1-p[count-1].b;
int y=1,z=0;
for(int k=1;k<x-1;k++) y=y*10;
for(int j=p[count-1].b+1;j<p[count-1].b+x;j++){
z=z+y*(a[j]-'0'); y=y/10;
}
number=number+isch(p[count-1].a)*z;
}
printf("%.3fg/mol",number);
return 0;
}
虽然看着有点多,但是可以说是解决了那个“简单”的问题。如有错误,请各位联系我。
这道题怎么说的乍一看简单的很,其实一看例子就知道了,如果字母后面没有数字呢?怎么判断,没有数字算作一个,在最后一个的话简单,如果是在中间出现这么一个字母,那么就要检测字母。
开干:
首先要知道数字的ACSII码,这样才能判断并且知道这个数到底是几。
当写到这里,你就一定知道了又一个陷阱,就是如果数字是两位数怎么办,三位数怎么办,还要一直判断下去么,怎么写才简单呢?
看了很多其他人的解法好多都是最多只判断到两位数那三位数四位数到底怎么办?
这么一道看似简单的题我却研究了好久好久,终于以位置为中心研究出来了。直接看代码吧
#include<stdio.h>
#include<string.h>
#include<ctype.h>
typedef struct Point{
char a;//字母
int b;//位置
}point;
double isch(char a){
if(a=='C') return 12.01;
else if(a=='H') return 1.008;
else if(a=='O') return 16.00;
else if(a=='N') return 14.01;
else return 0;
}
int main(){
char a[20];
double number=0.0;
int b[20],count=0;
point p[10];
memset(b,0,sizeof(b));
scanf("%s",a);
for(int i=0;i<strlen(a);i++){//记录每个字母出现的位置
if(a[i]>=65&&a[i]<=90){
p[count].a=a[i]; p[count].b=i;
count++;
}
}
for(int i=0;i<count-1;i++){
int x=p[i+1].b-p[i].b;
if((p[i].b+1)==p[i+1].b){
number=number+isch(p[i].a);
}else{
int y=1,z=0;
for(int k=1;k<x-1;k++) y=y*10;
for(int j=p[i].b+1;j<p[i].b+x;j++){
z=z+y*(a[j]-'0'); y=y/10;
}
number=number+isch(p[i].a)*z;
}
}
if((strlen(a)-1)==p[count-1].b){
number=number+isch(p[count-1].a);
}else{
int x=strlen(a)-1-p[count-1].b;
int y=1,z=0;
for(int k=1;k<x-1;k++) y=y*10;
for(int j=p[count-1].b+1;j<p[count-1].b+x;j++){
z=z+y*(a[j]-'0'); y=y/10;
}
number=number+isch(p[count-1].a)*z;
}
printf("%.3fg/mol",number);
return 0;
}
虽然看着有点多,但是可以说是解决了那个“简单”的问题。如有错误,请各位联系我。
相关文章推荐
- 算法竞赛入门经典第四章习题4-7 RAID! UVA - 509
- 【算法竞赛入门经典第二版学习】第三章习题
- 算法竞赛入门经典:习题2-6排列
- 算法竞赛入门经典习题1-5 打折
- 【算法竞赛入门经典】【第二章】课后习题
- 算法竞赛入门经典习题3-1 得分(Score,ACM/ICPC Seoul2005,UVa1585)
- 算法竞赛入门经典-习题3-2 分子量(Molar Mass, ACM/ICPC Seoul 2007, UVa1586)
- 算法竞赛入门经典第二章习题解答
- 刘汝佳算法竞赛入门经典 第四单元习题答案自编
- {算法竞赛入门经典}第二章 习题解答及例题小结
- 算法竞赛入门经典:习题3-4 计算器
- 「算法竞赛入门经典 第二版」第 3 章 数组和字符串 习题解答
- 排列 permutation 算法竞赛入门经典第二版 习题2-6
- 算法竞赛入门经典第四章习题4-1 Xiangqi UVA - 1589
- 算法竞赛入门经典第3章习题
- 算法竞赛入门经典 习题2-3剩余数定理+最大公约数/最小公倍数
- 算法竞赛入门经典 习题1-8 绝对值(abs)
- 算法竞赛入门经典习题3-6 &3-7 进制转换
- 刘汝佳算法竞赛入门经典 第二单元习题答案自编
- 算法竞赛入门经典课后习题答案:第一章(C++解法)