本文主要是介绍习题3-2 UVa 1586 Molar Mass,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
难点:
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
这篇关于习题3-2 UVa 1586 Molar Mass的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!