public static void Main(){
InvertedInt[] a1 = {2022, 3033, 1533, 43};
for(int a = 0; a < a1.Length; a++){
Console.WriteLine(a1[a]);
Console.WriteLine(frac.reciprocal());
Console.WriteLine((int)(a1.Length * frac.reciprocal()));
public static int GCD(int a, int b) => b == 0 ? a : GCD(b, a % b);
public Fraction(int num, int den){
(this.num, this.den) = (-this.num, -this.den);
throw new DivideByZeroException("Denominator can't be 0");
int commonFactor = GCD(num, den);
this.num /= commonFactor;
this.den /= commonFactor;
public static implicit operator Fraction(InvertedInt num) => new Fraction(1, num.num);
public static implicit operator Fraction(int num) => new Fraction(num, 1);
public static implicit operator Fraction(double num){
int n = (int)(Math.Floor(num));
return new Fraction(n, 1);
}else if(1 - error < num){
return new Fraction(n + 1, 1);
int middle_n = lower_n + upper_n;
int middle_d = lower_d + upper_d;
if(middle_d * (num + error) < middle_n){
}else if(middle_n < (num - error) * middle_d){
return new Fraction(n * middle_d + middle_n, middle_d);
public static explicit operator int(Fraction a) => a.num / a.den;
public static explicit operator float(Fraction a) => ((float) a.num) / a.den;
public static explicit operator double(Fraction a) => ((double) a.num) / a.den;
public static Fraction operator +(Fraction a, Fraction b) => new Fraction(a.num * b.den + a.den * b.num, a.den * b.den);
public static Fraction operator +(Fraction a) => a;
public static Fraction operator ++(Fraction a) => new Fraction(a.num + a.den, a.den);
public static Fraction operator -(Fraction a, Fraction b) => new Fraction(a.num * b.den - a.den * b.num, a.den * b.den);
public static Fraction operator -(Fraction a) => new Fraction(-a.num, -a.den);
public static Fraction operator --(Fraction a) => new Fraction(a.num - a.den, a.den);
public static Fraction operator *(Fraction a, Fraction b) => new Fraction(a.num * b.num, a.den * b.den);
public static Fraction operator /(Fraction a, Fraction b) => new Fraction(a.num * b.den, a.den * b.num);
public int GCD(int a, int b) => b == 0 ? a : GCD(b, a % b);
public Fraction reciprocal() => new Fraction(den, num);
public override string ToString() => den == 1 ? $"{num}" : $"{num} / {den}";
public class InvertedInt{
private InvertedInt(int num){
public static implicit operator InvertedInt(int num) => new InvertedInt(num);
public static explicit operator int(InvertedInt a) => 1 / a.num;
public static explicit operator float(InvertedInt a) => 1f / a.num;
public static explicit operator double(InvertedInt a) => 1.0 / a.num;
public static Fraction operator +(InvertedInt a, InvertedInt b) => new Fraction(b.num + a.num, a.num * b.num);
public static Fraction operator +(InvertedInt a, int valueNum) => new Fraction(valueNum * a.num + 1, a.num);
public static Fraction operator +(int valueNum, InvertedInt a) => new Fraction(valueNum * a.num + 1, a.num);
public static Fraction operator +(InvertedInt a) => a;
public static Fraction operator -(InvertedInt a, InvertedInt b) => new Fraction(b.num - a.num, a.num * b.num);
public static Fraction operator -(InvertedInt a, int valueNum) => new Fraction(-valueNum * a.num + 1, a.num);
public static Fraction operator -(int valueNum, InvertedInt a) => new Fraction(valueNum * a.num - 1, a.num);
public static Fraction operator -(InvertedInt a) => -a.num;
public static InvertedInt operator *(InvertedInt a, InvertedInt b) => a.num * b.num;
public static Fraction operator *(InvertedInt a, int valueNum) => new Fraction(valueNum, a.num);
public static Fraction operator *(int valueNum, InvertedInt a) => new Fraction(valueNum, a.num);
public static Fraction operator /(InvertedInt a, InvertedInt b) => new Fraction(b.num, a.num);
public static Fraction operator /(InvertedInt a, int valueNum) => new Fraction(1, a.num * valueNum);
public static Fraction operator /(int valueNum, InvertedInt a) => a.num * valueNum;
public int reciprocal() => num;
public override string ToString() => Math.Abs(num) == 1 ? $"{num}" : num > 0 ? $"1 / {num}" : $"-1 / {-num}";