📄 chem_felicia.cpp
字号:
/**********************************************************************
Author: Felicia
Created Time: 2009-2-9 10:07:49
File Name: whu09_1.cpp
Description:
**********************************************************************/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
using namespace std;
typedef long long int64;
const int maxint = 0x7FFFFFFF;
const int64 maxint64 = 0x7FFFFFFFFFFFFFFFLL;
const int maxelement = 200;
map <string, int> id;
int w[maxelement];
string ele[maxelement];
int element_cnt;
struct bigint {
static const int maxd = 100;
static const int base = 100000000;
int d[maxd];
int len;
void clear() {
len = 0;
memset(d, 0, sizeof(d));
}
bigint() {clear();}
bigint(int x) {
clear();
for (len = 0; x; x /= base)
d[len++] = x % base;
}
void operator +=(const bigint &b) {
len = max(len, b.len);
int carry = 0;
for (int i = 0; i < len; i++) {
d[i] += b.d[i] + carry;
if (carry = (d[i] >= base))
d[i] -= base;
}
if (carry) d[len++] = carry;
}
void operator *=(const int &x) {
int carry = 0;
for (int i = 0; i < len; i++) {
d[i] = d[i] * x + carry;
carry = d[i] / base;
d[i] %= base;
}
if (carry) d[len++] = carry;
}
void print(int t) {
char s[1000];
if (len == 0) {
if (t == 0)
printf("0");
else
printf("0.00");
return;
}
if (len == 1) {
if (t == 0)
printf("%d", d[0]);
else
printf("%.2lf", d[0] / 100.0);
return;
}
sprintf(s, "%d", d[len - 1]);
int p = strlen(s);
for (int i = len - 2; i >= 0; i--) {
sprintf(s + p, "%08d", d[i]);
p += 8;
}
for (int i = 0; i < p; i++) {
if (i == p - t)
printf(".");
printf("%c", s[i]);
}
}
};
struct node {
bigint mass;
bigint num[200];
node() {}
void operator *=(const int &t) {
mass *= t;
for (int i = 0; i < element_cnt; i++)
num[i] *= t;
}
void operator +=(const node &b) {
mass += b.mass;
for (int i = 0; i < element_cnt; i++)
num[i] += b.num[i];
}
void clear() {
mass.clear();
for (int i = 0; i < element_cnt; i++)
num[i].clear();
}
};
int get_id(const string &num, int l, int r) {
string t;
for (int i = l; i < r; i++)
t.push_back(num[i]);
return id[t];
}
node stack[300];
void chem_parser(string s) {
int top = 0;
stack[top].clear();
for (unsigned i = 0; i < s.size(); i++) {
if (s[i] == '(')
stack[++top].clear();
else if (s[i] == ')') {
int t = s[++i] - '0';
stack[top] *= t;
stack[top - 1] += stack[top];
--top;
}
else if (isupper(s[i])) {
int id;
if (i + 1 < s.size() && islower(s[i + 1])) {
id = get_id(s, i, i + 2);
++i;
}
else {
id = get_id(s, i, i + 1);
}
int t = 1;
if (i + 1 < s.size() && isdigit(s[i + 1])) {
t = s[i + 1] - '0';
++i;
}
stack[top].mass += w[id] * t;
stack[top].num[id] += t;
}
}
}
int main() {
int ca = 0;
scanf("%d", &ca);
while (ca--) {
scanf("%d", &element_cnt);
id.clear();
for (int i = 0; i < element_cnt; i++) {
char buf[100];
int t1, t2;
scanf("%s%d.%d", buf, &t1, &t2);
ele[i] = buf;
id[buf] = i;
w[i] = t1 * 100 + t2;
}
int m;
scanf("%d", &m);
for (int i = 0; i < m; i++) {
char buf[1100];
scanf("%s", buf);
chem_parser(buf);
stack[0].mass.print(2);
for (int j = 0; j < element_cnt; j++)
if (stack[0].num[j].len != 0) {
printf(" %s[", ele[j].c_str());
stack[0].num[j].print(0);
printf("]");
}
printf("\n");
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -