//IComparable nonstatic implementation public int CompareTo(object obj) { LongInt snd = (LongInt)obj; if (digits.Count > snd.digits.Count) { return(1); } else if (digits.Count < snd.digits.Count) { return(-1); } else { int maxlenght = Math.Max(digits.Count, snd.digits.Count); for (int i = maxlenght - 1; i >= 0; i--) { int aval = i >= digits.Count ? 0 : digits[i]; int bval = i >= snd.digits.Count ? 0 : snd.digits[i]; if (aval > bval) { return(1); } else if (aval < bval) { return(-1); } } return(0); } }
//ADDITION public static LongInt operator +(LongInt a, LongInt b) { int l = a.digits.Count; int r = b.digits.Count; LongInt res = new LongInt(); //Lenght of the result int length = Math.Max(l, r) + 1; res.digits.Clear(); int carry = 0; for (int i = 0; i < length; i++) { int adigit = i >= a.digits.Count ? 0 : a.digits[i]; int bdigit = i >= b.digits.Count ? 0 : b.digits[i]; res.digits.Add(bdigit + adigit + carry); // суммируем последние разряды чисел carry = (res.digits[i] / rank); // если есть разряд для переноса, переносим его в следующий разряд res.digits[i] %= rank; // если есть разряд для переноса он отсекается } return(res); }
static void StaticManualTest(LongInt n1, LongInt n2) { WriteLine("----------"); WriteLine($"n1 = {n1}, n2 = {n2}"); WriteLine($"{n1} + {n2} = {n1 + n2}"); WriteLine($"{n1} - {n2} = {n1 - n2}"); WriteLine($"{n1} * {n2} = {n1 * n2}"); WriteLine($"{n1} / {n2} = {n1 / n2}"); WriteLine($"{n1} % {n2} = {n1 % n2}"); WriteLine($"{n1} > {n2} = {n1 > n2}"); WriteLine($"{n1} < {n2} = {n1 < n2}"); WriteLine($"{n1} >= {n2} = {n1 >= n2}"); WriteLine($"{n1} <= {n2} = {n1 <= n2}"); WriteLine($"{n1} == {n2} = {n1 == n2}"); WriteLine($"{n1} != {n2} = {n1 != n2}"); LongInt num = 1; for (int i = 0; i < 200; i++) { num *= int.MaxValue; } WriteLine($"Big Number {num}"); }