⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fraction.cs

📁 一、前言 24点游戏是一个常见游戏
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Text;

/// <summary>
/// 分数,设置这个类的目的是可以让除法运算不丢失有效数字
/// </summary>
class Fraction : IComparable<Fraction>
{
    /// <summary>
    /// 分子
    /// </summary>
    public int Numerator;
    /// <summary>
    /// 分母
    /// </summary>
    public int Denominator = 1;
    /// <summary>
    /// 分数值,比较大小是使用
    /// </summary>
    public double Value { get { return Numerator * 1.0 / Denominator; } }

    public Fraction(int numerator)
    {
        Numerator = numerator;
    }
    /// <summary>
    /// 进行分数运算
    /// </summary>
    public static Fraction Operate(Fraction f1, Fraction f2, Operator opt)
    {
        int n1 = f1.Numerator;
        int n2 = f2.Numerator;
        int d1 = f1.Denominator;
        int d2 = f2.Denominator;
        Fraction ret = new Fraction(0);
        switch (opt.Symbol)
        {
            case '+':
                ret.Numerator = n1 * d2 + n2 * d1;
                ret.Denominator = d1 * d2;
                ret.Compact();
                return ret;
            case '-':
                ret.Numerator = n1 * d2 - n2 * d1;
                ret.Denominator = d1 * d2;
                ret.Compact();
                return ret;
            case '*':
                ret.Numerator = n1 * n2;
                ret.Denominator = d1 * d2;
                ret.Compact();
                return ret;
            case '/':
                if (d2 == 0 || n2 == 0) break;
                ret.Numerator = n1 * d2;
                ret.Denominator = d1 * n2;
                ret.Compact();
                return ret;
        }
        return null;
    }
    /// <summary>
    /// 实现IComparable<Fraction>接口
    /// </summary>
    public int CompareTo(Fraction other)
    {
        int v1 = Numerator * other.Denominator;
        int v2 = Denominator * other.Numerator;
        return v1 - v2;//Value.CompareTo(other.Value)不如这样精确

    }

    /// <summary>
    /// 归约分子分母到统一形式,以保证同值的分数比较结果相同
    /// </summary>
    public void Compact()
    {
        //分子分母约分
        int gcd = GCD(Math.Abs(Numerator), Math.Abs(Denominator));
        if (gcd != 0)
        {
            Numerator /= gcd;
            Denominator /= gcd;
        }
        if (Denominator < 0)
        {//调整分母为正
            Denominator = -Denominator;
            Numerator = -Numerator;
        }
    }

    static void Swap(ref int x, ref int y)
    {
        x ^= y; y ^= x; x ^= y;
    }

    /// <summary>
    /// 辗转相减法求最大公约数
    /// </summary>
    static int GCD(int x, int y)
    {
        if (0 == x) return y;
        if (0 == y) return x;
        do
        {
            if (x < y)
                Swap(ref x, ref y);
            x -= y;
        } while (x != 0);
        return y;
    }

    public override string ToString()
    {
        return Value.ToString();
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -