UVa 1586 Nolar Mass(習題3-2)
阿新 • • 發佈:2018-11-07
這道題的關鍵點應該就是在原子符號中間的數字的地方了吧
注意之前出現過的原子在接下來也會出現 統計原子數量,計算
沒記錯的話這道題好像借鑑了之前網上的一個程式碼
程式碼:
#include<cstring> #include<iostream> #include<iostream> using namespace std; const int maxn=200; char s[maxn]; double ans[maxn]; int num(int m,int n) { int temp; for(int i=m;i<n;i++) if(s[i]<='9'&&s[i]>='0') temp=i; else break; int n=0; for(int i=pos;i<=temp;i++) //字串轉整數型 n=n*10+(s[i]-'0'); return n-1; } int main() { int t; cin>>t; while(t--) { memset(ans,0,sizeof(ans)); cin>>s; int len=strlen(s); int flag=0; for(int i=0;i<len;i++) { if(s[i]=='C') ans[i]=12.01; if(s[i]=='H') ans[i]=1.008; if(s[i]=='O') ans[i]=16.00; if(s[i]=='N') ans[i]=14.01; if(s[i]>='1'&&s[i]<='9'&&flag==0) { ans[i]=ans[i-1]*num(i,len); //計算分子量 flag=1; } if(!(s[i]>='1'&&s[i]<='9')) flag=0; } double sum=0; for(int i=0;i<len;i++) sum+=ans[i]; printf("%.3f\n",sum); } return 0; }
----------------------------2018-08-24更新-------------------
重新做了一下,這次思路比兩年前清晰了許多
也是用到了在寫python的時候自己程式設計的思想
應該算是初步的面向物件程式設計
通過多個函式來達到目的
//Decision's template #include<cstdio> #include<cstring> #include<iostream> #include<cstdlib> #include<vector> #include<queue> #include<stack> #include<algorithm> #include<string> #include<cmath> #include<map> #include<set> using namespace std; #define DP_maxn 16 #define maxn 100000 #define INF 10000007 #define mod 1000000007 #define mst(s,k) memset(s,k,sizeof(s)) typedef long long ll; struct Edge{ int from,to,dist; Edge(int u,int v,int d):from(u),to(v),dist(d){} }; /*-------------------------------template End--------------------------------*/ double v1 = 12.01,v2 = 1.008,v3 = 16.00,v4 = 14.01; int n; bool isalaph(char c) { if(c<='Z'&&c>='A') return 1; else return 0; } int get_num(char *s,int pos_1,int pos_2) { if(isalaph(s[pos_1])||pos_1>=strlen(s)) return 1; int num = 0; pos_2 -= 1; //cout<<pos_1<<" "<<pos_2<<endl; for(int i = pos_1;i<=pos_2;i++) { // cout<<num<<endl; num *= 10; num += s[i]-'0'; } //cout<<num<<endl; return num; } double get_ans(char *s){ double ans = 0; int len = strlen(s); for(int i = 0;i<len;i++){ if(isalaph(s[i])){ int pos = i+1; for(pos;s[pos]<='9'&&s[pos]>='0'&&pos<len;pos++); if(s[i]=='C') ans += get_num(s,i+1,pos)*v1; if(s[i]=='H') ans += get_num(s,i+1,pos)*v2; if(s[i]=='O') ans += get_num(s,i+1,pos)*v3; if(s[i]=='N') ans += get_num(s,i+1,pos)*v4; } } return ans; } int main() { char s[100]; cin>>n; for(int i = 1;i<=n;i++) { cin>>s; printf("%.3lf\n",get_ans(s)); } return 0; }