ccf化学方程式

服了第三题就没有拿过满分
下面代码又是70分不知道哪错了

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

int tonumber(char s[], int l, int r) {
	int sum = 0;
	for (int i = 0; i < r - l; ++i) {
		sum += pow(10, i) * (s[r - i - 1] - '0');
	}
	if (sum == 0) return 1;
	return sum;
}

void dfs(int number, char s[], int start, int end, int hash[]) {
	if (start > end) {
		return ;
	}
	int l = start, r = start;
	if (s[r] >= 'A' && s[r] <= 'Z') {
		char a = s[r];
		char b = 'a';
		++r;
		int x = 0;
		if (s[r] >= 'a' && s[r] <= 'z') {
			b = s[r];
			x = 1;
			++r;
		}
		l = r;
		while (s[r] >= '0' && s[r] <= '9') {
			++r;
		}
		int number1 = tonumber(s, l, r);
		int loc;
		if (x == 0) {
			loc = (a - 'A' + 1) * 207;
		} else {
			loc = (a - 'A') * 207 + b - 'a';
		}
		hash[loc] += number * number1;
		dfs(number, s, r, end, hash);
	} else if (s[r] == '(') {
		int sign = -1;
		while (s[r] != ')' || sign != 0) {
			if (s[r] == '(') {
				++sign;
			}
			if (s[r] == ')') {
				--sign;
			}
			++r;
		}
		int sign1 = r;
		++r;
		l = r;
		while (s[r] >= '0' && s[r] <= '9') {
			++r;
		}
		int number1 = tonumber(s, l, r);
		dfs(number1 * number, s, start + 1, sign1 - 1, hash);
		dfs(number, s, r, end, hash);
	}
}

void togetoutnumber(char s[], int start, int end, int hash[]) {
	int l = start, r = start;
	while (s[r] < '9' && s[r] >= '0') {
		++r;
	}
	int number = tonumber(s, l, r);
	dfs(number, s, r, end, hash);
}

bool ifequal(char s[], int hash1[], int hash2[]) {
	int n = strlen(s);
	int start = 0;
	int sign = 0;
	for (int end = 0; end <= n; ++end) {
		if (s[end] == '+' || s[end] == '=' || s[end] == '\0') {
			if (sign == 0) {
				togetoutnumber(s, start, end - 1, hash1);
			} else {
				togetoutnumber(s, start, end - 1, hash2);
			}
			if (s[end] == '=') {
				sign = 1;
			}
			end++;
			start = end;
		}
	}
	for (int i = 0; i < 50005; ++i) {
		if (hash1[i] != hash2[i]) {
			return false;
		}
	}
	return true;
}

int main() {
	int hash1[50005] = {0};
	int hash2[50005] = {0};
	int n;
	scanf("%d", &n);
	getchar();
	bool ans[n];
	char string[2005];
	for (int i = 0; i < n; ++i) {
		gets(string);
		ans[i] = ifequal(string, hash1, hash2); 
		memset(hash1, 0, sizeof(hash1));
		memset(hash2, 0,sizeof(hash2));
	}	
	for (int i = 0; i < n; ++i) {
		if (ans[i]) {
			printf("Y\n");
		} else {
			printf("N\n");
		}
	}
	return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值