当前位置: 代码迷 >> 综合 >> [UVa1586] 关于用getchar与scanf_s解决问题
  详细解决方案

[UVa1586] 关于用getchar与scanf_s解决问题

热度:44   发布时间:2024-01-19 07:04:16.0

根据题目思路很明确,就是要分辨出分子式的字母和数字。

当判断为字母时,将字母缓存,计算现在的分子式,将数字缓存清空。

当判断为数字时,将数字缓存*10再加上新获取的数字。

当分子式结束时,判断最后一个字符进行上述的步骤。

下面是代码:

#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{const char rev[]= "CHON0123456789";const double num[] = { 12.01, 1.008, 16.00, 14.01 };int a,b;cin >> a;while ((b = getchar()) != EOF && b != '\n');//清空缓存区while (a--){double tempc = 0; //缓存当前字母的分子量int tempi=0;//缓存数字int c=0;double res=0.0;while ((c = getchar()) != EOF && c != '\n'){int i;for ( i = 0; c != rev[i]; i++);//获取字符在数组的位置//cout << i << endl;if (i < 4)//遇到字母时,就要统计一下分子量,并缓存当前字母的分子量并清零数字缓存{if (tempi) res += tempi*tempc;else res += tempc;tempc = num[i];tempi = 0;//cout << res << endl;}else//遇到数字时,要将数字存入tempi中,再读取字符{tempi = tempi * 10 + (c - '0');  continue;}}if (tempi) res += tempi*tempc;//如果是以数字结尾,就要补上对分子量的计算else res += tempc;printf("%.3f\n", res);}
}



不过很不幸,虽然代码在编缉器(vs2013)里可以完善通过,不过submit之后,却总是wrong answer。

最后很无奈,估计是在线评测系统的缓存区和本地有所不同,只好采用另一种方法了,把getchar 用scanf来代替掉,下面是代码


#include<stdio.h>
#include<iostream>
#include<string.h>using namespace std;#define maxn 100
int main()
{const char rev[] = "CHON0123456789";const double num[] = { 12.01, 1.008, 16.00, 14.01 };int a, b;cin >> a;while (a--){double tempc = 0;int tempi = 0;char c[maxn];double res = 0.0;scanf("%s", c,80);//原来代码是scanf_s("%s", c,80);在线测评识别不了只得替换for (int j = 0; j < strlen(c);j++){int i;for (i = 0; c[j] != rev[i]; i++);if (i < 4){if (tempi) res += tempi*tempc;else res += tempc;tempc = num[i];tempi = 0;}else{tempi = tempi * 10 + (c[j] - '0');continue;}}if (tempi) res += tempi*tempc;else res += tempc;printf("%.3f\n", res);}
}

换成scanf之后,就不用考虑缓存区的问题了,鲁棒性更强了。