Codewars 6 Kyu : Fractions class

题目

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),一个构造方法,让我们给这个类添加分数的加法以及需要加出来的结果是最简形式。

  1. 首先,我们需要写一个加法Add,注意这个加法需要是静态方法。该方法中的参数类型为Fraction,直接用字母表示出和,然后想办法将和的分子分母约分(第51-60行代码),再返回约分后的和。
  2. 有了静态方法之后,我们需要能直接用+号完成我们写的加法Add的功能,为此需要进行操作符重载,在重载的加法中调用我们写的静态方法Add,就算完成了加法的部分。代码见:42-44行。
  3. 题目还要求我们以string的形式返回运算结果,因此我们需要对ToString方法进行重写(是对object类中的ToString方法进行重写),因为ToString方法是一个虚方法(virtual),因此是可以重写(override)的。代码见:38-40行。

参考资料

  1. 运算符重载:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/statements-expressions-operators/overloadable-operators
  2. object类:https://docs.microsoft.com/zh-cn/dotnet/api/system.object?view=netframework-4.7.2

发表评论

您的电子邮箱地址不会被公开。