当前位置: 代码迷 >> 综合 >> 习题3-2 UVa 1586 Molar Mass
  详细解决方案

习题3-2 UVa 1586 Molar Mass

热度:8   发布时间:2024-01-16 14:12:10.0

难点:
C123H5OH12—- 下标出现多位数的情况

要点:
1.另设一个getnum函数,当字符串出现数字转入,由此输出多位数的情况

源代码:

#include<stdio.h>
#include<string.h>const int maxn=200;
char s[maxn];   //s和ans数组定义在头文件可以在下面所有函数使用
double ans[maxn];int getnum(int pos, int len)
{int temp;   for (int i = pos; i < len; i++){if (s[i] >= '0'&&s[i] <= '9')temp = i;    //使temp等于数字下标末尾的数组值else break;}int sum = 0;for (int i = pos; i <= temp; i++){sum = sum * 10 + (s[i] - '0');}return sum-1;  //易错:必须输出sum-1,因为如C13中前面C已经算了一次,后面13又算了13次,因此应减1输出
}int main()
{int t;scanf("%d", &t);while (t--){memset(ans, 0, sizeof(ans));scanf("%s", s);int len = strlen(s);int flag = 0;for (int i = 0; i < len; i++){  if (s[i] == 'C')  ans[i] = 12.01;//通过将值都赋予ans计算if (s[i] == 'O')  ans[i] = 16.00;if (s[i] == 'H')  ans[i] = 1.008;if (s[i] == 'N')  ans[i] = 14.01;if (s[i] >= '0'&&s[i] <= '9'&&flag==0){ans[i] = ans[i - 1] * getnum(i, len);flag = 1;   //flag的作用是防止前面已经是数字}if (!(s[i] >= '0'&&s[i] <= '9'))  flag = 0;}   //flag为0说明前面是字符不是数字,才能进入数字判断double sum_s = 0;for (int i = 0; i < len; i++)sum_s = sum_s + ans[i];printf("%.3lf\n", sum_s);}return 0;
}

学习心得:
1.一个个判断相加较麻烦,可以先将要加的值输入数组,通过数组提高效率
2.可利用flag变量来判断真假情况,temp变量来储存已确定的变化的值如i