挑战本题最抽象的AC代码
查看原帖
挑战本题最抽象的AC代码
671013
KawaragiMomoka楼主2024/7/18 20:06

rt

#include <bits/stdc++.h>
using namespace std;

#define int __int128

const int maxn = 105;
int n;
char str[maxn];
struct Number {
    int up, down;
} num[maxn];
int cntn, cnts;
char sign[maxn];

int gcd(int a, int b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}

int lcm(int a, int b) {
    return a * b / gcd(a, b);
}

void write(int x) {
    if (x < 0) putchar('-'), x = -x;
    if (x > 9) write(x / 10);
    putchar(x % 10 + '0');
}

signed main() {
    scanf("%s", str + 1);
    int n = strlen(str + 1);
    str[n + 1] = '-';
    n++;
    int l = 1;
    for (int i = 2; i <= n; i++) {
        if (str[i] == '+' || str[i] == '-') {
            sign[++cnts] = str[i];
            int up = 0;
            if (str[l] == '-') l++;
            for (int j = l; j < i; j++) {
                if (str[j] == '/') {
                    l = j + 1;
                    break;
                }
                up = up * 10 + str[j] - '0';
            }
            int down = 0;
            for (int j = l; j < i; j++) {
                down = down * 10 + str[j] - '0';
            }
            l = i + 1;
            num[++cntn].up = up;
            num[cntn].down = down;
        }
    }
    int base = num[1].down;
    for (int i = 2; i <= cntn; i++) {
        base = lcm(base, num[i].down);
    }
    for (int i = 1; i <= cntn; i++) {
        int val = base / num[i].down;
        num[i].down *= val;
        num[i].up *= val;
    }
    int ans = 0;
    if (str[1] == '-') {
        ans -= (num[1].up * 2);
    }
    ans += num[1].up;
    for (int i = 1; i < cnts; i++) {
        if (sign[i] == '+') {
            ans += num[i + 1].up;
        } else {
            ans -= num[i + 1].up;
        }
    }
    int op = 1;
    if (ans < 0) op = -1, ans = -ans;
    int val = gcd(base, ans);
    if (val == base) write(op * ans / base);
    else {
        write(op * ans / val);
        putchar('/');
        write(base / val);
    }
    return 0;
}
2024/7/18 20:06
加载中...