1. 程式人生 > 實用技巧 >UVA-1586 Molar mass(模擬)

UVA-1586 Molar mass(模擬)

我們知道,對於一道模擬題,需要用計算機來解決,說明其中有操作相同的組成部分,我們稱之為階段。我們人工對每一個階段給定操作進行處理,然後讓計算機對不同階段進行列舉或者說迴圈。遇到這種題的時候一定要分清階段是什麼,階段裡的內容和操作是什麼,一定一定不要混淆相鄰階段之間的操作!!!對於此題來說,每一階段就是一個元素和它後面可能跟著的陣列,所以一次while迴圈裡處理的就是這一個階段。(這種思想類似於https://acm.uestc.edu.cn/problem/bilibili-acfun-and-more/description這題)

這裡還注意一波黑科技 isdigit是用來判斷這個字元變數是否是個數字 isalpha是判斷這個字元變數是否是字母,如果是大寫字母返回1,如果是小寫字母返回2,如果不是字母返回0

這幾個函式都在 ctype.h標頭檔案裡

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 const int MAX=105;
 4 int t,ls;
 5 char s[MAX];
 6 double ans;
 7 double get(char c){
 8     if (c=='C') return 12.01;
 9     if (c=='H') return 1.008;
10     if (c=='O') return 16.00;
11     if (c=='N') return 14.01;
12 }
13 int
main(){ 14 freopen ("molar.in","r",stdin); 15 freopen ("molar.out","w",stdout); 16 int i,j;double zt,num; 17 scanf("%d\n",&t); 18 while (t--){ 19 scanf("%s",s+1); 20 ls=strlen(s+1); 21 i=1;ans=0; 22 while (i<=ls){ 23 if (isalpha(s[i])){
24 zt=get(s[i]); 25 num=0.0; 26 i++; 27 } 28 if (isdigit(s[i])){ 29 while (i<=ls && isdigit(s[i])){ 30 num=num*10+s[i]-'0'; 31 i++; 32 } 33 ans+=num*zt; 34 } 35 else ans+=zt; 36 } 37 printf("%.3lf\n",ans); 38 } 39 return 0; 40 }