题目的意思给的很清楚,但是坑点还是非常多。列举一下:
- 系数为0时的特判
- 合并同类项
- 合并同类项后系数为0 的特判
//比如这组样例 -1x^10+1x^10+0x^1 1x^0
- 约分后为负数,负号应该在分子上
给出我的ac代码:
#include<bits/stdc++.h>
using namespace std;
#define clr(a) memset(a, 0, sizeof(a))
#define line cout<<"--------------"<<endl
typedef long long ll;
const int maxn = 1e7 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
char u[maxn], d[maxn];
int upcnt, lowcnt;
struct node{
int k, n;
}up[maxn], low[maxn];
int gcd(int a, int b){
return b == 0 ? a : gcd(b, a % b);
}
bool cmp(node a, node b){
return a.n > b.n;
}
int main(){
scanf("%s%s", u, d);
int lu = strlen(u);
int ld = strlen(d);
for(int i = 0; i < lu; i++){
if(u[i] == 'x'){
int pos = i-1, temp = 0, op = 1;
while(u[pos] >= '0' && u[pos] <= '9') pos--;
if(u[pos] == '-') op = -1;
pos ++;
for(; pos < i; pos++)
temp = temp * 10 + (u[pos] - '0');
if(temp == 0) continue;
if(op == -1) temp *= op;
up[upcnt].k = temp;
pos = i+2; temp = 0; op = 1;
while(u[pos] >= '0' && u[pos] <= '9')pos++;
for(int j = i+2; j < pos; j++)
temp = temp * 10 + (u[j] - '0');
up[upcnt++].n = temp;
}
}
for(int i = 0; i < ld; i++){
if(d[i] == 'x'){
int pos = i-1, temp = 0, op = 1;
while(d[pos] >= '0' && d[pos] <= '9')pos--;
if(d[pos] == '-') op = -1;
pos ++;
for(; pos < i; pos++)
temp = temp * 10 + (d[pos] - '0');
if(temp == 0) continue;
if(op == -1) temp *= op;
low[lowcnt].k = temp;
pos = i+2; temp = 0; op = 1;
while(d[pos] >= '0' && d[pos] <= '9')pos++;
for(int j = i+2; j < pos; j++)
temp = temp * 10 + (d[j] - '0');
low[lowcnt++].n = temp;
}
}
sort(up, up+upcnt, cmp);
sort(low, low+lowcnt, cmp);
for(int i = 1; i < upcnt; i++)
if(up[i].n == up[0].n) up[0].k += up[i].k;
for(int i = 1; i < lowcnt; i++)
if(low[i].n == low[0].n) low[0].k += low[i].k;
if(lowcnt == 0 || upcnt == 0) {
printf("0\n"); return 0;
}
if(up[0].n == low[0].n){
int tex = gcd(up[0].k, low[0].k);
int xx = up[0].k/tex, yy = low[0].k/tex;
if(yy == 1 || yy == -1) printf("%d\n", xx);
else{
if((xx>0 && yy >0) || (xx < 0 && yy < 0))printf("%d/%d\n", xx, yy);
else printf("%d/%d\n", abs(xx)*-1, abs(yy));
}
}
else if(up[0].n > low[0].n){
if(up[0].k == 0) printf("0\n");
else printf("oo\n");
}
else printf("0\n");
return 0;
}