UVA-1586 Molar mass(模擬)
阿新 • • 發佈:2020-10-18
我們知道,對於一道模擬題,需要用計算機來解決,說明其中有操作相同的組成部分,我們稱之為階段。我們人工對每一個階段給定操作進行處理,然後讓計算機對不同階段進行列舉或者說迴圈。遇到這種題的時候一定要分清階段是什麼,階段裡的內容和操作是什麼,一定一定不要混淆相鄰階段之間的操作!!!對於此題來說,每一階段就是一個元素和它後面可能跟著的陣列,所以一次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 intmain(){ 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 }