📄 fraction.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 + -