日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第八届河南省省赛 A.挑战密室

發布時間:2024/8/26 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第八届河南省省赛 A.挑战密室 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
挑戰密室時間限制:1000 ms | 內存限制:65535 KB 難度:4描述 R組織的特工Dr. Kong 為了尋找丟失的超體元素,不幸陷入WTO密室。Dr. Kong必須盡快找到解鎖密碼逃離,否則幾分鐘之后,WTO密室即將爆炸。Dr. Kong發現密室的墻上寫了許多化學方程式中。化學方程式,也稱為化學反應方程式,是用化學式表示物質化學反應的式子。化學方程式反映的是客觀事實。因此書寫化學方程式要遵守兩個原則:一是必須以客觀事實為基礎;二是要遵守質量守恒定律。化學方程式不僅表明了反應物、生成物和反應條件。同時,化學計量數代表了各反應物、生成物物質的量關系,通過相對分子質量或相對原子質量還可以表示各物質之間的質量關系,即各物質之間的質量比。對于氣體反應物、生成物,還可以直接通過化學計量數得出體積比。例如:2NaOH+H2SO4=Na2SO4+2H2O經過多次試探、推理,Dr. Kong發現密碼是4位數字,就隱藏在化學方程式等號后的第一個分子中,其分子量就可能是密碼(若分子量不足4位,前面加0)。好在Dr. Kong還記得墻上各化學方程式用到的化學元素的原子量如下: 你能幫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.小括號最多一層. 來源 第八屆河南省程序設計大賽

? ?好吧 ?,我承認 ?這個題 ?確實 ?沒做成功 ? 一直報錯 ? 也不知道是為啥. ? 反正也是醉了 ? 下面先附上 ?錯誤的代碼 ??

1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 #include<math.h> 5 using namespace std ; 6 int main() 7 { 8 double q,l,m,n,t,sum,w,r; 9 int i,e; 10 char a[2050]; 11 scanf("%lf",&t); 12 while(t--) 13 { 14 w=m=0; 15 scanf("%s",a); 16 l=strlen(a); 17 for(i=0;i<l;i++) 18 { 19 if(a[i-1]=='=') 20 { 21 break; 22 } 23 } 24 e=i; 25 for(sum=0;i<l;i++) 26 { 27 if(a[i]=='+') 28 break; 29 if(a[e]-'0'>=0&&a[e]-'0'<=9) 30 { 31 r=q=0; 32 while(a[i]-'0'>=0&&a[i]-'0'<=9) 33 { 34 r=r*pow(10,q)+(a[i]-'0'); 35 q++; 36 if(!(a[i+1]-'0'>=0&&a[i+1]-'0'<=9)) 37 break; 38 i++; 39 } 40 i++; 41 e=-1; 42 } 43 q=n=0; 44 if(!(a[i]-'0'>=0&&a[i]-'0'<=9)) //當 這次不是數字 越界的時候 也不是數字哦. 45 { 46 if(a[i]=='(') 47 { 48 i++; 49 while(a[i]=='('||a[i]!=')') 50 { 51 if(a[i]=='C'&&a[i+1]!='a') 52 m+=12; 53 else 54 if(a[i]=='H') 55 m+=2; 56 else 57 if(a[i]=='O') 58 m+=16; 59 else 60 if(a[i]=='N'&&a[i+1]!='a') 61 m+=14; 62 else 63 if(a[i]=='C'&&a[i+1]=='l') 64 { 65 m+=35; 66 i++; 67 } 68 else 69 if(a[i]=='S') 70 m+=32; 71 else 72 if(a[i]=='A'&&a[i+1]=='l') 73 { 74 m+=27; 75 i++; 76 } 77 else 78 if(a[i]=='C'&&a[i+1]=='a') 79 { 80 m+=40; 81 i++; 82 } 83 else 84 if(a[i]=='Z'&&a[i+1]=='n') 85 { 86 m+=65; 87 i++; 88 } 89 else 90 if(a[i]=='N'&&a[i+1]=='a') 91 { 92 m+=23; 93 i++; 94 } 95 if(a[i]==')') 96 i++; 97 n=1; 98 i++; 99 } 100 } 101 else 102 { 103 104 if(a[i]=='C'&&a[i+1]!='a') 105 m+=12; 106 else 107 if(a[i]=='H') 108 m+=2; 109 else 110 if(a[i]=='O') 111 m+=16; 112 else 113 if(a[i]=='N'&&a[i+1]!='a') 114 m+=14; 115 else 116 if(a[i]=='C'&&a[i+1]=='l') 117 { 118 m+=35; 119 i++; 120 } 121 else 122 if(a[i]=='S') 123 m+=32; 124 else 125 if(a[i]=='A'&&a[i+1]=='l') 126 { 127 m+=27; 128 i++; 129 } 130 else 131 if(a[i]=='C'&&a[i+1]=='a') 132 { 133 m+=40; 134 i++; 135 } 136 else 137 if(a[i]=='Z'&&a[i+1]=='n') 138 { 139 m+=65; 140 i++; 141 } 142 else 143 if(a[i]=='N'&&a[i+1]=='a') 144 { 145 m+=23; 146 i++; 147 } 148 n=1; ////用于處理 當這個化學元素沒有后綴時的情況 149 } 150 } 151 if(a[i+1]-'0'>=0&&a[i+1]-'0'<=9) //有后綴時. 152 { 153 i++; 154 n=0; 155 while(a[i]-'0'>=0&&a[i]-'0'<=9) 156 { 157 n=n*pow(10,q)+(a[i]-'0'); 158 q++; 159 if(!(a[i+1]-'0'>=0&&a[i+1]-'0'<=9)) 160 break; 161 i++; 162 } 163 } 164 sum=sum+m*n; 165 m=0; 166 } 167 printf("%04.lf\n",r*sum); 168 r=1; 169 } 170 return 0; 171 }

比較失敗 ? ? 當一道題 ? 有思路但是是在解決不出來的時候 ? ?就刪掉 ?優化著 ?在寫一次.

?

-----------------------------------------------------------下面附上正確代碼----------------------------------

1 #include<stdio.h> 2 #include<math.h> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 int main() 7 { 8 int i,m,n,t,l,q,w,e,sum,r; 9 char a[500],b[200]; 10 scanf("%d",&t); 11 while(t--) 12 { 13 scanf("%s",a); //開始將需要的字符剝離出來 14 l=strlen(a); 15 bool OK =false; 16 memset(b,'\0',sizeof(b)); 17 for(r=w=n=q=i=0;i<l;i++) 18 { 19 if(a[i-1]=='=') 20 OK=true; 21 if(OK&&a[i]=='+') 22 { 23 OK=false; 24 // b[r]='\0'; 25 } 26 if(OK) 27 { 28 if(q!=0) // 整理完數字 之后 就需要 轉存字母了. 29 { 30 b[w++]=a[i]; 31 continue; //防止 到 else 那里在此賦值 . 32 } 33 if(((a[i]-'0')<=9&&(a[i]-'0')>=0)&&(w==0&&r==0)) //如果第一個是數字的話........ 34 { 35 while((a[i]-'0')<=9&&(a[i]-'0')>=0) //將數字 正整理一下 36 { 37 n=n*pow(10,q)+(a[i]-'0'); 38 q++; 39 i++; 40 } //整理完畢之后 41 i--; 42 } 43 else //不是數字的話 44 { 45 n=1; 46 b[r++]=a[i]; 47 } 48 } 49 } 50 l=strlen(b); 51 for(sum=i=0;i<l;i++) 52 { 53 q=e=0; 54 if(!(b[i]-'0'>=0&&b[i]-'0'<=9)) //當 這次不是數字 越界的時候 也不是數字哦. 55 { 56 if(b[i]=='(') 57 { 58 i++; 59 m=0; 60 while(b[i]!=')') 61 { 62 if(b[i]=='C'&&b[i]=='a') 63 { 64 m+=40; 65 i++; 66 } 67 else 68 if(b[i]=='N'&&b[i+1]=='a') 69 { 70 m+=23; 71 i++; 72 } 73 else 74 if(b[i]=='Z'&&b[i+1]=='n') 75 { 76 m+=65; 77 i++; 78 } 79 else 80 if(b[i]=='A'&&b[i+1]=='l') 81 { 82 m+=27; 83 i++; 84 } 85 else 86 if(b[i]=='C'&&b[i+1]=='l') 87 { 88 m+=35; 89 i++; 90 } 91 else 92 if(b[i]=='C') 93 m+=12; 94 else 95 if(b[i]=='H') 96 m+=2; 97 else 98 if(b[i]=='O') 99 m+=16; 100 else 101 if(b[i]=='N') 102 m+=14; 103 else 104 if(b[i]=='S') 105 m+=32; 106 i++; 107 } 108 } 109 else 110 if(b[i]=='C'&&b[i]=='a') 111 { 112 m=40; 113 i++; 114 } 115 else 116 if(b[i]=='N'&&b[i+1]=='a') 117 { 118 m=23; 119 i++; 120 } 121 else 122 if(b[i]=='Z'&&b[i+1]=='n') 123 { 124 m=65; 125 i++; 126 } 127 else 128 if(b[i]=='A'&&b[i+1]=='l') 129 { 130 m=27; 131 i++; 132 } 133 else 134 if(b[i]=='C'&&b[i+1]=='l') 135 { 136 m=35; 137 i++; 138 } 139 else 140 if(b[i]=='C') 141 m=12; 142 else 143 if(b[i]=='H') 144 m=2; 145 else 146 if(b[i]=='O') 147 m=16; 148 else 149 if(b[i]=='N') 150 m=14; 151 else 152 if(b[i]=='S') 153 m=32; 154 e=1; //用于處理 當這個化學元素沒有后綴時的情況 155 } 156 if(b[i+1]-'0'>=0&&b[i+1]-'0'<=9) //有后綴時. 157 { 158 i++; 159 e=0; 160 while(b[i]-'0'>=0&&b[i]-'0'<=9) 161 { 162 e=e*pow(10,q)+(b[i]-'0'); 163 q++; 164 if(!(b[i+1]-'0'>=0&&b[i+1]-'0'<=9)) 165 break; 166 i++; 167 } 168 } 169 sum=sum+m*e; 170 } 171 printf("%04.0lf\n",double(n*sum)); 172 } 173 return 0; 174 }

------------------------下面附上 優化之后的 ?代碼 ? 并且 ? 附上解析 ?-------教訓總結-------------------------------- ??

1 2 #include <stdio.h> 3 #include <string.h> 4 char che[10][3]={"N","C","O","Cl","S","H","Al","Ca","Zn","Na"}; 5 int val[10]={14,12,16,35,32,2,27,40,65,23}; 6 int tonum(char str[]) 7 { 8 for(int i=0;i<10;i++) 9 if(strcmp(str,che[i])==0) 10 return val[i]; 11 } 12 int main() 13 { 14 int ncase; 15 char str[500]; 16 scanf("%d",&ncase); 17 while(ncase--) 18 { 19 memset(str,0,sizeof(str)); 20 scanf("%s",str); 21 bool flag=false; 22 int k=0; 23 char word[55]; 24 memset(word,0,sizeof(word)); 25 for(int i=0;i<strlen(str);i++) 26 { 27 if(flag&&str[i]=='+') 28 break; 29 if(str[i]=='=') 30 { 31 flag=true; 32 continue; 33 } 34 if(flag) 35 { 36 word[k++]=str[i]; 37 } 38 } 39 char ch[3]; 40 int sum=0,head=1,star=0,n; 41 if(word[0]>='0'&&word[0]<='9') 42 head=word[0]-'0',star=1; 43 for(int i=star;i<k;i++) 44 { 45 memset(ch,0,sizeof(ch)); 46 n=1; 47 if(word[i]=='(') 48 { 49 i++; 50 int temp=0; 51 while(word[i]!=')'&&i<k) 52 { 53 memset(ch,0,sizeof(ch)); 54 if((word[i]>='A'&&word[i]<='Z')&&(word[i+1]>='a'&&word[i+1]<='z')) 55 { 56 if(word[i+2]>='0'&&word[i+2]<='9') 57 n=word[i+2]-'0'; 58 ch[0]=word[i];ch[1]=word[i+1];ch[2]='\0'; 59 i++; 60 temp+=n*tonum(ch); 61 } 62 else if((word[i]>='A'&&word[i]<='Z')&&!(word[i+1]>='a'&&word[i+1]<='z')) 63 { 64 if(word[i+1]>='0'&&word[i+1]<='9') 65 n=word[i+1]-'0'; 66 ch[0]=word[i];ch[1]='\0'; 67 temp+=n*tonum(ch); 68 } 69 i++; 70 } 71 if(word[i+1]>='0'&&word[i+1]<='9') 72 n=word[i+1]-'0'; 73 sum+=n*temp; 74 } 75 else if((word[i]>='A'&&word[i]<='Z')&&(word[i+1]>='a'&&word[i+1]<='z')) 76 { 77 if(word[i+2]>='0'&&word[i+2]<='9') 78 n=word[i+2]-'0'; 79 ch[0]=word[i];ch[1]=word[i+1];ch[2]='\0'; 80 i++; 81 sum+=n*tonum(ch); 82 } 83 else if((word[i]>='A'&&word[i]<='Z')&&!(word[i+1]>='a'&&word[i+1]<='z')) 84 { 85 if(word[i+1]>='0'&&word[i+1]<='9') 86 n=word[i+1]-'0'; 87 ch[0]=word[i];ch[1]='\0'; 88 sum+=n*tonum(ch); 89 } 90 } 91 sum=sum*head; 92 printf("%04d\n",sum); 93 } 94 return 0; 95 }

?

?

轉載于:https://www.cnblogs.com/A-FM/p/5165790.html

總結

以上是生活随笔為你收集整理的第八届河南省省赛 A.挑战密室的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。