求相对分子量,我做复杂了。。。
思路是判定到元素CHON就加上单个的原子量,如果后面跟着数字,肯定是大于1的,所以就算出数字是多少,假设是k,然后用数字前邻接的原子量*(k-1),减一是因为在识别出元素符号时已经加了一次单个原子量了。
问题:在处理以数字结尾的分子式时,最后结尾处的数组指针跟前面的数字处理不同,要向前指一位。一开始没发现这个问题,所以耽误了好多时间。。。
#include <iostream>
#include <cstdio>
#include <string.h>
#include <cmath>
#define maxn 1010
using namespace std;
//
int main()
{
int n;
char a[85];
cin>>n;
while(n--){
cin>>a;
int len = strlen(a);
double ans = 0.0;
int temp,x=0,k=0;
for(int i=0;i<len;i++){
if(a[i]>='1'&&a[i]<='9'){
x++;
if(i!=len-1) continue;
}
if(x!=0){
//printf("X----%d\n",x);
for(int j=1;j<=x;j++){
if(i!=len-1)
k += (a[i-j]-'0')*pow(10,j-1);
else k += (a[i-j+1]-'0')*pow(10,j-1);
}
if(i!=len-1){
if(a[i-x-1]=='C') ans += 12.01*(k-1);
if(a[i-x-1]=='H') ans += 1.008*(k-1);
if(a[i-x-1]=='O') ans += 16.00*(k-1);
if(a[i-x-1]=='N') ans += 14.01*(k-1);
}
if(i==len-1){
if(a[i-x]=='C') ans += 12.01*(k-1);
if(a[i-x]=='H') ans += 1.008*(k-1);
if(a[i-x]=='O') ans += 16.00*(k-1);
if(a[i-x]=='N') ans += 14.01*(k-1);
}
}
//printf("K----%d\n",k);
k=0;
x=0;
if(a[i]=='C') ans += 12.01;
if(a[i]=='H') ans += 1.008;
if(a[i]=='O') ans += 16.00;
if(a[i]=='N') ans += 14.01;
}
printf("%0.3f\n",ans);
}
return 0;
}