题目
You are provided with a skeleton of the class ‘Fraction’, which accepts two arguments (numerator, denominator).
EXAMPLE:
Fraction fraction1 = new Fraction(4, 5);
Your task is to make this class string representable, and addable while keeping the result in the minimum representation possible.
EXAMPLE:
Console.Write(fraction1 + new Fraction(1, 8));
// Outputs: 37/40
NB: DON’T use the built_in class ‘fractions.Fraction’
Enjoy!
代码
public class Fraction
{
private long Top { get; set; }
private long Bottom { get; set; }
public Fraction(long numerator, long denominator)
{
Top = numerator;
Bottom = denominator;
}
// Equality checking
public override int GetHashCode() => this.GetHashCode(); // not actually used
public override bool Equals(object o) => Compare(this, o as Fraction) == 0;
public static bool operator ==(Fraction f1, Fraction f2) => Compare(f1, f2) == 0;
public static bool operator !=(Fraction f1, Fraction f2) => Compare(f1, f2) != 0;
private static long Compare(Fraction f1, Fraction f2) => f1.Top * f2.Bottom - f2.Top * f1.Bottom;
public override string ToString(){
return this.Top+"/"+this.Bottom;
}
public static Fraction operator+ (Fraction a,Fraction b) {
return Add(a,b);
}
// Your work here!
public static Fraction Add(Fraction a,Fraction b){
long m=a.Top*b.Bottom+a.Bottom*b.Top;
long n=a.Bottom*b.Bottom;
for(int i = 2; i<=n&&i<=m;){
if(m%i==0&&n%i==0){
m/=i;
n/=i;
i=2;
}
else{
i++;
}
}
var sum = new Fraction(m,n);
return sum;
}
}
解题思路
本题涉及到很多内容,因此先放代码,再根据代码给出解答过程。
已知题目给出了fraction分数类中的两个字段(分子Top、分母Bottom),一个构造方法,让我们给这个类添加分数的加法以及需要加出来的结果是最简形式。
- 首先,我们需要写一个加法Add,注意这个加法需要是静态方法。该方法中的参数类型为Fraction,直接用字母表示出和,然后想办法将和的分子分母约分(第51-60行代码),再返回约分后的和。
- 有了静态方法之后,我们需要能直接用+号完成我们写的加法Add的功能,为此需要进行操作符重载,在重载的加法中调用我们写的静态方法Add,就算完成了加法的部分。代码见:42-44行。
- 题目还要求我们以string的形式返回运算结果,因此我们需要对ToString方法进行重写(是对object类中的ToString方法进行重写),因为ToString方法是一个虚方法(virtual),因此是可以重写(override)的。代码见:38-40行。
参考资料
- 运算符重载:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/statements-expressions-operators/overloadable-operators
- object类:https://docs.microsoft.com/zh-cn/dotnet/api/system.object?view=netframework-4.7.2