【Week2实验 A】化学 【模拟】

题意:

包含6个原子和5个化学键的烷烃基共有5种,用1-6标号6个原子,然后用一对数字a,b表示原子a和原子b之间有一个化学键。给定5行a,b,判断出它的类别,输出其化学名称(见下图)。原子没有标号方法,即同一个原子可能标号为1,也可能为2,依次类推。
在这里插入图片描述


思路:

首先找出5种类别之间较大的区别:n-类的各原子键数分别为1,2,2,2,2,1,即有2个1键原子,4个2键原子;2-类和3-类都有3个1键原子,2个2键原子,1个3键原子,需要特判;2,3-类有4个1键原子和2个3键原子;2,2-类有4个1键原子,1个2键原子和1个4键原子。
于是应先计算出所给烷烃基各个原子的键数,如果是2-类或3-类要特判:找到其3键原子,判断其三端共有几个2键原子或3键原子。(也可以通过判断三端的1键原子个数来得出结论)若有2个2(3)键原子,则为3-类;若有1个2(3)键原子,则为2-类。
计算原子键数时,先将5个化学键的两端原子存入a[5]和b[5]中,然后用yuanzi[7]数组来遍历计算6个原子对应键的个数。后用jian[5]数组来计算i键原子有多少个。之后便是判断部分。
2-类与3-类的特判:首先找到3键原子,记为middle,然后在化学键的两端原子中寻找它邻接的另一个原子,记为next,然后遍历寻找next的邻接原子(且不为middle),如果有,则next为2(3)键原子,sum++。找完middle的三端原子后,根据2(3)键原子个数sum判断即可。


总结:

一道模拟题,首先要读懂题,找出5种类别之间的较大区别,然后根据这种区别来做题。


代码:

#include <iostream>
using namespace std;

int main()
{
	long long int T;
	cin>>T;
	for(int i=0; i<T; i++)
	{
		int a[5],b[5];
		for(int j=0; j<5; j++)
			cin>>a[j]>>b[j];
		int yuanzi[7]={0,0,0,0,0,0,0};	//6个原子对应键的个数
		for(int j=0; j<5; j++)
		{
			yuanzi[a[j]]++;
			yuanzi[b[j]]++;
		}
		int jian[5]= {0,0,0,0,0};	//键为i个的原子个数
		for(int j=1; j<7; j++)
		{
			if(yuanzi[j]==1)	jian[1]++;
			else if(yuanzi[j]==2)	jian[2]++;
			else if(yuanzi[j]==3)	jian[3]++;
			else if(yuanzi[j]==4)	jian[4]++;
		}
		//判断
		if(jian[1]==2&&jian[2]==4)	cout<<"n-hexane"<<endl;
		else if(jian[1]==4&&jian[2]==1&&jian[4]==1)	cout<<"2,2-dimethylbutane"<<endl;
		else if(jian[1]==4&&jian[3]==2)	cout<<"2,3-dimethylbutane"<<endl;
		else	//判断2-还是3-,找到3键原子,判断其三端各有几个原子
		{
			int middle;	//3键原子
			for(int j=1; j<7; j++)
				if(yuanzi[j]==3)
					middle=j;
			int sum=0;	//3端共有几个2(3)原子
			for(int j=0; j<5; j++)
			{
				int next;
				if(a[j]==middle||b[j]==middle)
				{
					if(a[j]==middle)	next=b[j];
					else next=a[j];
					for(int k=0; k<5; k++)
						if((a[k]==next&&b[k]!=middle)||(b[k]==next&&a[k]!=middle))
						{
							sum++;
							break;
						}
				}
			}
			if(sum==2)	cout<<"3-methylpentane"<<endl;
			else if(sum==1)	cout<<"2-methylpentane"<<endl;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值