第九届河南理工大学算法程序设计大赛 F. Mo的极限

题目的意思给的很清楚,但是坑点还是非常多。列举一下:

  • 系数为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;
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值