第九屆河南理工大學算法程序設計大賽 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;
}
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章