编辑代码

#include <iostream>
using namespace std;

int gcd(int a, int b) {    //计算最大公约数
    if (b == 0)
        return a;
    else
        return gcd(b, a % b);
}
void simplifyFraction(int& numerator, int& denominator) {    //将分数化为最简形式
    int commonDivisor = gcd(numerator, denominator);
    numerator /= commonDivisor;
    denominator /= commonDivisor;
}

int main()
{
    int n, m, a, zi, mu;
    cin >> n >> m >> a;
    /* 
    n代表门数
    m代表后面有羊的门的数量
    a代表选择后打开的无羊门数量
    */
    if (m >= n || a > (n - m)) {
        cout << "输入不合法";
    } else {
        /*
        公式说明:
        题目:设n门,m羊,选择1门,开a(a<=n-m)门,求换后胜率.
        由题意:应分两种情况:
        1. 选中有羊门时:
            易知,这种情况的几率为m/n.
            换门后还剩余(m-1)个有羊门,(n-a-1)个可供换的门.
            则此时胜率为(m-1)/(n-a-1).
        2. 选中无羊门时:
            易知,这种情况的几率为[1-(m/n)]即(n-m)/n.
            换门后还剩余m个有羊门,(n-a-1)个可供换的门.
            则此时胜率为m/(n-a-1).
        因为两种情况的几率分别为m/n与(n-m)/n.
        所以总胜率为(m/n)*[(m-1)/(n-a-1)]+[(n-m)/n]*[m/(n-a-1)]
        化解为:m(n-p)/n(n-a-1)

        感谢我吧,这么用心的作者不多了
        */
        zi = m * (n - 1);   //胜率的分子
        mu = n * (n - a - 1);   //胜率的分母
        simplifyFraction(zi, mu);
        //结果以最简分数呈现
        if (zi >= mu) {
            cout << 1;
        } else {
        cout << zi << "/" << mu;
        }
    }
    return 0;
}