记录编号 94054 评测结果 WWWWW
题目名称 相对分子质量 最终得分 0
用户昵称 GravatarLetter zZZz 是否通过 未通过
代码语言 C++ 运行时间 0.003 s
提交时间 2014-03-29 20:10:25 内存使用 0.78 MiB
显示代码纯文本
  1. #include <fstream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <vector>
  6. using namespace std;
  7. ifstream fin ("molecular.in");
  8. ofstream fout ("molecular.out");
  9. int numd;
  10. int nums;
  11. int p=0;
  12. double stack[200];
  13. double mass[100]={0};
  14. class T
  15. {
  16. public:
  17. string name;
  18. double m;
  19. }d[20000];
  20. T s[20000];
  21. double mad(string x)
  22. {
  23. for (int i=0;i<=numd;i++)
  24. if (x==d[i].name)return d[i].m;
  25. return -1;
  26. }
  27. double mas(string x)
  28. {
  29. for (int i=0;i<=nums;i++)
  30. if (x==s[i].name)return s[i].m;
  31. return -1;
  32. }
  33. double work(string x)
  34. {
  35. int l=strlen(x.c_str());
  36. int i,j=0;
  37. for (i=0;i<l;)
  38. {
  39. if (x[i]>='A'&&x[i]<='Z'&&x[i+1]>='a'&&x[i+1]<='z')
  40. {
  41. string y,z1,z2;
  42. z1=x[i];
  43. z2=x[i+1];
  44. y=z1+z2;
  45. double q=mas(y);
  46. if (q!=-1)mass[j]=q;
  47. else if (q==-1) return -1;
  48. j++;
  49. i+=2;
  50. }
  51. else if (x[i]>='A'&&x[i]<='Z')
  52. {
  53. string y,z;
  54. z=x[i];
  55. y=z;
  56. double q=mad(y);
  57. if (q!=-1)mass[j]=q;
  58. else if (q==-1) return -1;
  59. j++;
  60. i++;
  61. }
  62. else if (x[i]=='(')
  63. {
  64. mass[j]=-1;
  65. i++;
  66. j++;
  67. }
  68. else if (x[i]==')')
  69. {
  70. mass[j]=0;
  71. i++;
  72. j++;
  73. }
  74. else if (x[i]>='0')
  75. {
  76. mass[j]=(x[i]-'0')*(-1)-2;
  77. i++;
  78. j++;
  79. }
  80. }
  81. for (i=0;i<j;i++)
  82. if (mass[i]<-1&&mass[i+1]<-1)
  83. {
  84. mass[i]=(mass[i]+2)*10+(mass[i+1]+2)-2;
  85. mass[i+1]=0;
  86. }
  87. for (i=0;i<j;i++)
  88. if (mass[i]>0&&mass[i+1]<-1)
  89. {
  90. mass[i]=mass[i]*(mass[i+1]+2)*(-1);
  91. mass[i+1]=0;
  92. }
  93. stack[0]=0;
  94. stack[1]=0;
  95. stack[2]=0;
  96. stack[3]=0;
  97. stack[4]=0;
  98. stack[5]=0;
  99. stack[6]=0;
  100. p=1;
  101. for (i=0;i<j;i++)
  102. {
  103. if (mass[i]>0)
  104. {
  105. while (mass[i]>=0)
  106. {
  107. stack[p]=stack[p]+mass[i];
  108. i++;
  109. }
  110. while (mass[i]>=0);
  111. p++;
  112. }
  113. if (mass[i]<0)
  114. stack[p-1]=stack[p-1]*(mass[i]+2)*(-1);
  115. }
  116. return stack[p-1];
  117. }
  118. int main()
  119. {
  120. double M;
  121. string n;
  122. for (nums=0,numd=0;;)
  123. {
  124. fin>>n;
  125. if (n=="END_OF_FIRST_PART")
  126. break;
  127. else
  128. {
  129. fin>>M;
  130. if (n.length()==1)
  131. {
  132. d[numd].name=n;
  133. d[numd].m=M;
  134. numd++;
  135. }
  136. else
  137. {
  138. s[nums].name=n;
  139. s[nums].m=M;
  140. nums++;
  141. }
  142. }
  143. } //将相对原子质量输入到a//
  144. fin>>n;
  145. while (n!="0")
  146. {
  147. double ans=work(n);
  148. if (ans!=-1)
  149. fout<<ans<<endl;
  150. else if (ans==-1)
  151. fout<<"UNKNOWN"<<endl;
  152. fin>>n;
  153. }
  154. return 0;
  155. }
  156.