列表

详情


NC210352. 分子

描述

在遥远的斯卡布罗集市,有机分子只能由 C, H, O 三种元素组成。根据珂学家们的探测,一个 C 原子的式量为 13 ,一个 H 原子的式量为 1 ,一个 O 原子的式量为 17 。一个有机分子的式量恰为各个原子的式量的总和。

对于有机分子式给出如下定义:
例如 (HH)3H(H)、CO2、CH12、CHHOO 都是合法的有机分子式。

而 4HC、CHTHOLLOY、CH3(CH2)3(CH(CHCH3)2CH3)2(CH2)3CH3 都不是合法的有机分子式。

对于符合上述要求的分子式,你能帮助珂学家们计算它的分子式量吗?

输入描述

输入仅一行,包含一个字符串,代表分子式。

保证符合上述定义,字符串中不含除 C, H ,O,括号和数字以外的字符,且长度不超过 

输出描述

在一行中输出一个整数,代表该分子的式量。

保证答案不超过 

示例1

输入:

CH3COOH

输出:

64

示例2

输入:

CH3(CH2)10CH3

输出:

182

示例3

输入:

H(HH)C(CH2)3O(H)1

输出:

79

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C(clang 3.9) 解法, 执行用时: 2ms, 内存消耗: 496K, 提交时间: 2020-08-05 21:01:36

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
char s[200000];
long long len,i;
long long max(long long a,long long b){
	return a>b?a:b;
}
long long fun(){
	long long t=0,ans=0;
	for(i;i<len;i++){
		long long k=0;
		while(s[i]>='0'&&s[i]<='9'){
			k=k*10+s[i]-'0';
			i++;
		}
		ans+=t*max(k,1);
		t=0;
		if(s[i]=='H')t=1;
		else if(s[i]=='O')t=17;
		else if(s[i]=='C')t=13;
		if(s[i]=='('){
			i++;
			t=fun();
		}
		else if(s[i]==')')break;
	}
	ans+=t;
	return ans;
}
int main(){
	gets(s);
	len=strlen(s);
	printf("%lld",fun());
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 548K, 提交时间: 2020-09-30 20:43:07

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
char a[100005];
int b[100];
int i=0;
int t;
ll fun()
{
	ll n=0;
	ll x=0;
	
	for(i;i<t;i++)
	{
		ll s=0;
		while(a[i]>='0'&&a[i]<='9'){
			s=s*10+(a[i]-'0');
			i++;
		}
		n=n+x*max(s,1LL);;
		x=0;
		if(a[i]=='O')x=17;
		if(a[i]=='H')x=1;
		if(a[i]=='C')x=13;
		if(a[i]=='(')
		{
			i++;
			x=fun();
		}
		else if(a[i]==')')break;
		
	}
	n=n+x;
	return n;
}
int main()
{

	scanf("%s",a);
	t=strlen(a);
	cout<<fun()<<endl;
	
	
}

C++11(clang++ 3.9) 解法, 执行用时: 8ms, 内存消耗: 584K, 提交时间: 2020-08-05 18:35:07

#include<iostream>
using namespace std;
typedef long long ll;
string s;
ll i,n;
ll solve(){
	ll ans=0,ji=0;
	for(;i<n;i++){
		ll xs=0;
		while(s[i]>='0'&&s[i]<='9'){
			xs=xs*10LL+s[i]-'0';
			i++;
		}
		ans+=ji*max(xs,1LL);
		ji=0;
		if(s[i]=='H')  ji=1;
		if(s[i]=='O')  ji=17;
		if(s[i]=='C')  ji=13;
		if(s[i]=='('){
			i++;
			ji=solve();
		}
		else if(s[i]==')')  break;
	}
	ans+=ji;
	return ans;
}
int main(){
	cin>>s;
	n=s.size();
	cout<<solve()<<endl;
	return 0;
}

Python3 解法, 执行用时: 496ms, 内存消耗: 54492K, 提交时间: 2022-06-13 16:37:00

s=input()

i=1
d=set('0123456789')
while i<len(s):
    if s[i] in d and s[i-1] not in d:
        s = s[:i]+'*'+s[i:]
        i+=2
    else:
        i+=1
        
s=s.replace('H','+1').replace('C','+13').replace('O','+17').replace('(','+(')
print(eval(s))

上一题