有理数系的线性代数运算程序(1)有理数类
线性代数主要涉及矩阵的运算,尤其是矩阵中行/列变换,矩阵的秩、行列式、线性方程组、特征值等问题。在开始设计之前,先完成有理数系的运算。我们要将分数形式的数字展现成分数而不是近似小数。
首先添加一个类RationalNumber,表示一个有理数,如果它是整数,则分母为1,如果它是小数,就保存成最简分数。如果是负有理数,保证负号在分子上。这样定义后重载四则运算和判等运算的运算符。
class RationalNumber { private int _num, _den; private int gcd(int x,int y) { if(x%y==0) { return y; } else { return gcd(y, x % y); } } public RationalNumber() { _num = 0; _den = 1; } public RationalNumber(int x) { _num = x; _den = 1; } public RationalNumber(int nn,int dd) { int sign = 1; int g = gcd(Math.Abs(nn), Math.Abs(dd)); if(nn*dd<0) { sign = -1; } _num = sign*Math.Abs(nn)/g; _den = Math.Abs(dd)/g; } public string ToLaTeX() { if (_den == 1) { return _num.ToString(); } else { if (_num > 0) { return String.Format("\\frac{{{0}}}{{{1}}}", _num, _den); } else { return String.Format("-\\frac{{{0}}}{{{1}}}", -_num, _den); } } } public override string ToString() { return String.Format("{0}/{1}", _num, _den); } public static RationalNumber operator+(RationalNumber self,RationalNumber o) { return new RationalNumber(self._num * o._den + self._den * o._num, self._den * o._den); } public static RationalNumber operator -(RationalNumber self, RationalNumber o) { return new RationalNumber(self._num * o._den - self._den * o._num, self._den * o._den); } public static RationalNumber operator *(RationalNumber self, RationalNumber o) { return new RationalNumber(self._num * o._num, self._den * o._den); } public static RationalNumber operator /(RationalNumber self, RationalNumber o) { return new RationalNumber(self._num * o._den, self._den * o._num); } public static RationalNumber operator /( int o, RationalNumber self) { return new RationalNumber( self._den * o, self._num); } public static RationalNumber operator /(RationalNumber self, int o) { return new RationalNumber(self._num , self._den *o ); } public static bool operator ==(RationalNumber self, RationalNumber o) { return self._num == o._num && self._den == o._den; } public static bool operator !=(RationalNumber self, RationalNumber o) { return !(self._num == o._num && self._den == o._den); } public static bool operator ==(RationalNumber self, int o) { return self._den == 1 && self._num == o; } public static bool operator !=(RationalNumber self, int o) { return (self._den != 1 || (self._den ==1 && self._num != o)); } public override bool Equals(Object o) { return this is RationalNumber && this == (RationalNumber)o; } public override int GetHashCode() { return Convert.ToInt32(String.Format("{0}{1}",_num , _den)); } }