版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/decision2016/article/details/53485983
这道题的关键点应该就是在原子符号中间的数字的地方了吧
注意之前出现过的原子在接下来也会出现 统计原子数量,计算
没记错的话这道题好像借鉴了之前网上的一个代码
代码:
#include<cstring>
#include<iostream>
#include<iostream>
using namespace std;
const int maxn=200;
char s[maxn];
double ans[maxn];
int num(int m,int n)
{
int temp;
for(int i=m;i<n;i++)
if(s[i]<='9'&&s[i]>='0') temp=i;
else break;
int n=0;
for(int i=pos;i<=temp;i++) //字符串转整数型
n=n*10+(s[i]-'0');
return n-1;
}
int main()
{
int t;
cin>>t;
while(t--)
{
memset(ans,0,sizeof(ans));
cin>>s;
int len=strlen(s);
int flag=0;
for(int i=0;i<len;i++)
{
if(s[i]=='C') ans[i]=12.01;
if(s[i]=='H') ans[i]=1.008;
if(s[i]=='O') ans[i]=16.00;
if(s[i]=='N') ans[i]=14.01;
if(s[i]>='1'&&s[i]<='9'&&flag==0)
{
ans[i]=ans[i-1]*num(i,len); //计算分子量
flag=1;
}
if(!(s[i]>='1'&&s[i]<='9'))
flag=0;
}
double sum=0;
for(int i=0;i<len;i++) sum+=ans[i];
printf("%.3f\n",sum);
}
return 0;
}
----------------------------2018-08-24更新-------------------
重新做了一下,这次思路比两年前清晰了许多
也是用到了在写python的时候自己编程的思想
应该算是初步的面向对象编程
通过多个函数来达到目的
扫描二维码关注公众号,回复:
3962090 查看本文章
//Decision's template
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<vector>
#include<queue>
#include<stack>
#include<algorithm>
#include<string>
#include<cmath>
#include<map>
#include<set>
using namespace std;
#define DP_maxn 16
#define maxn 100000
#define INF 10000007
#define mod 1000000007
#define mst(s,k) memset(s,k,sizeof(s))
typedef long long ll;
struct Edge{
int from,to,dist;
Edge(int u,int v,int d):from(u),to(v),dist(d){}
};
/*-------------------------------template End--------------------------------*/
double v1 = 12.01,v2 = 1.008,v3 = 16.00,v4 = 14.01;
int n;
bool isalaph(char c)
{
if(c<='Z'&&c>='A') return 1;
else return 0;
}
int get_num(char *s,int pos_1,int pos_2)
{
if(isalaph(s[pos_1])||pos_1>=strlen(s)) return 1;
int num = 0;
pos_2 -= 1;
//cout<<pos_1<<" "<<pos_2<<endl;
for(int i = pos_1;i<=pos_2;i++)
{
// cout<<num<<endl;
num *= 10;
num += s[i]-'0';
}
//cout<<num<<endl;
return num;
}
double get_ans(char *s){
double ans = 0;
int len = strlen(s);
for(int i = 0;i<len;i++){
if(isalaph(s[i])){
int pos = i+1;
for(pos;s[pos]<='9'&&s[pos]>='0'&&pos<len;pos++);
if(s[i]=='C') ans += get_num(s,i+1,pos)*v1;
if(s[i]=='H') ans += get_num(s,i+1,pos)*v2;
if(s[i]=='O') ans += get_num(s,i+1,pos)*v3;
if(s[i]=='N') ans += get_num(s,i+1,pos)*v4;
}
}
return ans;
}
int main()
{
char s[100];
cin>>n;
for(int i = 1;i<=n;i++)
{
cin>>s;
printf("%.3lf\n",get_ans(s));
}
return 0;
}