using System.Collections.Generic;
Rationnel r0 = new (2, 3),
Console.WriteLine($"{r0}, {r1}");
Console.WriteLine("{0}", new Rationnel(3, 6).Simplifier());
Console.WriteLine($"{r0} {(r0 == r1 ? "==" : "!=")} {r1}");
Console.WriteLine($"{r0} {(r0 == r1 ? "==" : "!=")} {r1}");
Console.WriteLine($"Symbolique : {r0 + r1}, décimal : {(float)(r0 + r1)}");
class DivisionParZéroException : Exception { }
class Rationnel : IEquatable<Rationnel>
private static int Pgcd(int a, int b) =>
b != 0 ? Pgcd(a, a % b) : a;
private int dénominateur;
public int Numérateur { get; init; }
throw new DivisionParZéroException();
public Rationnel(int num, int dénom)
public Rationnel(int num)
public Rationnel Simplifier()
int pgcd = Pgcd(Numérateur, Dénominateur);
return new Rationnel(Numérateur / pgcd, Dénominateur / pgcd);
public static bool operator ==(Rationnel r0, Rationnel r1) =>
public static bool operator !=(Rationnel r0, Rationnel r1) =>
public override bool Equals(object obj) =>
obj is Rationnel r && Equals(r);
public bool Equals(Rationnel r)
Rationnel r0 = Simplifier(),
return r0.Numérateur == r1.Numérateur &&
r0.Dénominateur == r1.Dénominateur;
public override int GetHashCode() =>
Numérateur.GetHashCode() ^ Dénominateur.GetHashCode();
public static bool operator <(Rationnel r0, Rationnel r1) =>
r0.Numérateur * r1.Dénominateur < r1.Numérateur * r0.Dénominateur;
public static bool operator >(Rationnel r0, Rationnel r1) =>
public static bool operator <=(Rationnel r0, Rationnel r1) =>
public static bool operator >=(Rationnel r0, Rationnel r1) =>
public static Rationnel operator +(Rationnel r0, Rationnel r1) =>
r0.Numérateur * r1.Dénominateur + r1.Numérateur * r0.Dénominateur,
r0.Dénominateur * r1.Dénominateur
public override string ToString() =>
$"{Numérateur}/{Dénominateur}";
static public explicit operator float(Rationnel r) =>
((float)r.Numérateur) / r.Dénominateur;
static public explicit operator double(Rationnel r) =>
((double)r.Numérateur) / r.Dénominateur;