挑戰密室
描述
R組織的特工Dr. Kong 為了尋找丟失的超體元素,不幸陷入WTO密室。Dr. Kong必須儘快找到解鎖密碼逃離,否則幾分鐘之後,WTO密室即將爆炸。
Dr. Kong發現密室的牆上寫了許多化學方程式中。化學方程式,也稱為化學反應方程式,是用化學式表示物質化學反應的式子。化學方程式反映的是客觀事實。因此書寫化學方程式要遵守兩個原則:一是必須以客觀事實為基礎;二是要遵守質量守恆定律。
化學方程式不僅表明了反應物、生成物和反應條件。同時,化學計量數代表了各反應物、生成物物質的量關係,通過相對分子質量或相對原子質量還可以表示各物質之間的質量關係,即各物質之間的質量比。對於氣體反應物、生成物,還可以直接通過化學計量數得出體積比。例如:2NaOH+H2SO4=Na2SO4+2H2O
經過多次試探、推理,Dr. Kong發現密碼是4位數字,就隱藏在化學方程式等號後的第一個分子中,其分子量就可能是密碼(若分子量不足4位,前面加0)。
好在Dr. Kong還記得牆上各化學方程式用到的化學元素的原子量如下:
N |
C |
O |
Cl |
S |
H |
Al |
Ca |
Zn |
Na |
14 |
12 |
16 |
35 |
32 |
2 |
27 |
40 |
65 |
23 |
你能幫Dr. Kong儘快找到密碼嗎?
輸入
第一行: K,表示有K個化學方程式;
接下來有K行,每行為一個化學方程式
輸出
對於每個化學方程式輸出一行:即密碼。
樣例輸入
3 2C+O2=2CO 2NaOH+H2SO4=Na2SO4+2H2O Ca2CO3+H2O=Ca2(OH)2+CO2
樣例輸出
0056 0142 0116
提示
2≤K≤8 ,化學方程式的長度不超過50, 所有原子,分子的數量不超過9.小括號最多一層.
來源
AC碼:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<iomanip>
using namespace std;
int val[10]={14,12,16,35,32,2,27,40,65,23};
char che[10][3]={"N","C","O","Cl","S","H","Al","Ca","Zn","Na"};
int ln(char str[])
{
for(int i=0;i<10;i++)
{
if(strcmp(str,che[i])==0)
return val[i];//字母相等,返回字母所代表的能量值
}
}
int main()
{
int k;
scanf("%d",&k);
char str[500];
while(k--)
{
bool flag=false;//做判斷用的(0)
int j=0;//記錄下標
char b[55];//將=號後第一個分子存到b[]陣列中
memset(str,0,sizeof(str));//初始0化
memset(b,0,sizeof(b));//初始0化
scanf("%s",str);//輸入化學方程式
for(int i=0;i<strlen(str);i++)
{
if(str[i]=='+'&&flag)
break;//在=之後遇到+號時執行結束
if(str[i]=='=')
{//如果遇到=,結束本次迴圈
flag=true;
continue;
}
if(flag)//將=號後第一個分子存到a[]陣列中
b[j++]=str[i];
}
char ch[3];
int sum=0,head=1,star=0,n;
if(b[0]>='0'&&b[0]<='9')
{
head=b[0]-'0';
star=1;
}
for(int i=star;i<j;i++)
{
memset(ch,0,sizeof(ch));
n=1;//記錄離子出現的次數
if(b[i]=='(')
{//如果括號在前
i++;
int temp=0;
while(b[i]!=')'&&i<j)
{
memset(ch,0,sizeof(ch));
if((b[i]>='A'&&b[i]<='Z')&&(b[i+1]>='a'&&b[i+1]<='z'))
{
if(b[i+2]>='0'&&b[i+2]<='9')
n=b[i+2]-'0';//n表示化學元素有幾個
ch[0]=b[i];
ch[1]=b[i+1];
ch[2]='\0';
i++;
temp+=n*ln(ch);//由兩個元素組成的原子質量
}
else if((b[i]>='A'&&b[i]<='Z')&&!(b[i+1]>='a'&&b[i+1]<='z'))
{
if(b[i+1]>='0'&&b[i+1]<='9')
n=b[i+1]-'0';
ch[0]=b[i];
ch[1]='\0';
temp+=n*ln(ch);//由一個元素組成的原子質量
}
i++;
}
if(b[i+1]>='0'&&b[i+1]<='9')
n=b[i+1]-'0';//遇到離子有多個數
sum+=n*temp;//乘與*個數
}
else if((b[i]>='A'&&b[i]<='Z')&&(b[i+1]>='a'&&b[i+1]<='z'))
{
if(b[i+2]>='0'&&b[i+2]<='9')
n=b[i+2]-'0';
ch[0]=b[i];
ch[1]=b[i+1];
ch[2]='\0';
i++;
sum+=n*ln(ch);//由兩個元素組成的原子質量
}
else if((b[i]>='A'&&b[i]<='Z')&&!(b[i+1]>='a'&&b[i+1]<='z'))
{
if(b[i+1]>='0'&&b[i+1]<='9')
n=b[i+1]-'0';
ch[0]=b[i];
ch[1]='\0';
sum+=n*ln(ch);//由一個元素組成的原子質量
}
}
sum*=head;
cout<<setfill('0')<<setw(4)<<sum<<endl;//輸出要求
/* 留4位,如果不滿四位,用0代替 */
}
return 0;
}
相關文章
- 挑戰系統 / 進入區域挑戰怪物
- xss挑戰賽writeup
- AI的道德挑戰AI
- 每天都在挑戰極限...
- 守衛者的挑戰
- 牛客挑戰賽58
- 獨立開發挑戰
- ARTS 挑戰(第三週)
- ARTS 挑戰(第二週)
- [譯] 挑戰 Flutter 之 TwitterFlutter
- Wanafly挑戰賽25 A因子
- [譯] 挑戰 Flutter 之 WhatsAppFlutterAPP
- [極客大挑戰 2019]Havefun
- [極客大挑戰 2019]PHPPHP
- [極客大挑戰 2019]BuyFlag
- [極客大挑戰 2019]Knife
- [極客大挑戰 2019]HardSQLSQL
- [極客大挑戰 2019]BabySQLSQL
- 老齡化加速的挑戰
- 容器安全的三大挑戰
- [SDOI2009] Bill的挑戰
- 需求審查的挑戰 - modernanalystNaN
- 迎接人生更大的挑戰
- 從今天開始挑戰 LeetCodeLeetCode
- tcpv4 checksum 挑戰下TCP
- AI晶片混戰,誰能挑戰英偉達?AI晶片
- 雲原生程式設計挑戰賽火熱開賽,51 萬獎金等你來挑戰!程式設計
- AI應用測試及挑戰AI
- [極客大挑戰 2019]HardSQL 1SQL
- [極客大挑戰 2019]BuyFlag 1
- [極客大挑戰 2019]PHP 1PHP
- 牛客挑戰賽72 總結
- SegmentFault 思否寫作挑戰賽!
- 雲原生安全的挑戰有哪些?
- 如何克服多雲管理的挑戰?
- 【經典概率題】百囚徒挑戰
- flutter SliverAppBar|8月更文挑戰FlutterAPP
- 如何應對Kubernetes的安全挑戰?