您的位置:首页 > 其它

习题3-2 UVa 1586 Molar Mass

2015-11-01 10:57 267 查看
难点:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: