//Converts InfInt to string
        public override string ToString()
        {
            int    i    = 0;
            InfInt zero = new InfInt();

            zero.Positive = false;
            if (zero.CompareTo(this) == 0)
            {
                return("0");
            }
            string returnString = "";

            if (!Positive)
            {
                returnString += '-';
            }
            while (Integer[i] == 0 && i < DIGITS - 1)
            {
                i++;
            }
            while (i < DIGITS)
            {
                returnString += Convert.ToString(Integer[i]);
                i++;
            }
            return(returnString);
        }
        //Subtracts the absolute values of two InfInt's
        private InfInt SubtractPositives(InfInt addValue)
        {
            InfInt temp     = new InfInt();
            InfInt tempThis = new InfInt();

            tempThis.EqualTo(this);
            //iterate the infint
            for (int i = DIGITS - 1; i >= 0; i--)
            {
                int j = i;
                //Borrow
                if (tempThis.Integer[i] < addValue.Integer[i])
                {
                    j--;
                    while (tempThis.Integer[j] == 0)
                    {
                        tempThis.Integer[j] -= 1;
                        j--;
                    }
                    tempThis.Integer[j] -= 1;
                    j++;
                    while (j <= i)
                    {
                        tempThis.Integer[j] += 10;
                        j++;
                    }
                }
                temp.Integer[i] = tempThis.Integer[i] - addValue.Integer[i];
            }
            return(temp);
        }
        //Continuation of Multiply function dealing with absolute values
        private InfInt MultiplyThese(int multValue, int lengthInput, int column)
        {
            InfInt returnValue = new InfInt();
            int    i           = 0;
            int    carry       = 0;

            try
            {
                while (i < lengthInput)
                {
                    int temp = Integer[DIGITS - 1 - i] * multValue;
                    temp += carry;
                    carry = temp / 10;
                    temp %= 10;
                    returnValue.Integer[DIGITS - 1 - i - column] = temp;
                    i++;
                }
                if (carry != 0)
                {
                    returnValue.Integer[DIGITS - 1 - i - column] = carry;
                }
            }
            catch (IndexOutOfRangeException)
            {
                Console.WriteLine($"Oops! The product of these two numbers is outside of the bounds");
                InfInt zero = new InfInt();
                return(zero);
            }
            return(returnValue);
        }
        //Adds absolute values of two InfInt's
        private InfInt AddPositives(InfInt addValue)
        {
            InfInt temp  = new InfInt();
            int    carry = 0;

            //iterate the infint
            for (int i = DIGITS - 1; i >= 0; i--)
            {
                temp.Integer[i] = Integer[i] + addValue.Integer[i] + carry;
                //determine if we need to carry the 1
                if (temp.Integer[i] > 9)
                {
                    temp.Integer[i] %= 10; //reduce to 0-9
                    carry            = 1;
                }
                else
                {
                    carry = 0;
                }
            }
            if (carry != 0)
            {
                Console.WriteLine($"Oops, your input produced a value larger than {DIGITS} digits long!");
                InfInt zero = new InfInt();
                return(zero);
            }
            if (!Positive)
            {
                temp.Positive = false;
            }

            return(temp);
        }
        //Checks to see which InfInt is greater
        private bool IsGreaterThan(InfInt addValue)
        {
            int i = 0;

            if (Positive && !addValue.Positive)
            {
                return(true);
            }
            else if (!Positive && addValue.Positive)
            {
                return(false);
            }
            while (i < DIGITS)
            {
                if (this.Integer[i] > addValue.Integer[i])
                {
                    return(true);
                }
                else if (this.Integer[i] < addValue.Integer[i])
                {
                    return(false);
                }
                i++;
            }
            return(false);
        }
        //Divides two InfInt's
        public InfInt Divide(InfInt divValue)
        {
            InfInt zero = new InfInt();
            InfInt one  = new InfInt("1");
            InfInt ten  = new InfInt("10");

            //Numerator smaller than denominator
            if (this.CompareTo(divValue) == -1)
            {
                return(zero);
            }
            //Numerator == Denominator
            if (this.CompareTo(divValue) == 0)
            {
                return(one);
            }
            //Divide by zero
            if (divValue.CompareTo(zero) == 0)
            {
                Console.WriteLine("Oops, you tried to divide by zero!");
                return(zero);
            }
            //Numerator larger than denominator
            int    i           = 0;
            InfInt returnValue = new InfInt();
            InfInt tempThis    = new InfInt();

            while (i < DIGITS)
            {
                //Drop down a value
                int    tempNumber = this.Integer[i];
                string tempString = Convert.ToString(tempNumber);
                InfInt tempInfInt = new InfInt(tempString);
                for (int l = 0; l < DIGITS; l++)
                {
                    tempThis = tempThis.Add(tempInfInt);
                    //divValue divides into tempThis
                    if (tempThis.CompareTo(divValue) >= 0)
                    //See how many times divValue goes into tempThis
                    {
                        InfInt tempReturnValue = new InfInt("1");
                        while (divValue.CompareTo(tempThis.Subtract(divValue.Multiply(tempReturnValue))) <= 0)
                        {
                            tempReturnValue = tempReturnValue.Add(one);
                        }
                        returnValue.Integer[i] = tempReturnValue.Integer[DIGITS - 1];
                        tempThis = tempThis.Subtract(tempReturnValue.Multiply(divValue));
                    }
                    tempThis.Positive = true;
                    tempThis          = tempThis.Multiply(ten);
                    i++;
                }
            }
            if (Positive != divValue.Positive)
            {
                returnValue.Positive = false;
            }
            return(returnValue);
        }
        //Sets values in InfInt equal to those of the inpt
        private void EqualTo(InfInt input)
        {
            int i = 0;

            Positive = input.Positive;
            while (i < DIGITS)
            {
                Integer[i] = input.Integer[i];
                i++;
            }
        }
        //freebie add courtesy of professor amack
        public InfInt Add(InfInt addValue)
        {
            InfInt temp = new InfInt();

            if (Positive == addValue.Positive)
            {
                temp = AddPositives(addValue);
            }
            //addvalue is negative
            else if (Positive && (!addValue.Positive))
            {
                addValue.Positive = true;
                if (IsGreaterThan(addValue))
                {
                    temp = SubtractPositives(addValue);
                }
                else
                {
                    temp          = addValue.SubtractPositives(this);
                    temp.Positive = false;
                }

                addValue.Positive = false;
            }
            else if (!Positive && addValue.Positive)
            {
                addValue.Positive = false;

                if (IsGreaterThan(addValue))
                {
                    temp = addValue.SubtractPositives(this);
                }
                else
                {
                    temp          = SubtractPositives(addValue);
                    temp.Positive = false;
                }

                addValue.Positive = true;
            }
            return(temp);
        }
        //Multiplies 2 InfInt's
        public InfInt Multiply(InfInt multValue)
        {
            int    lengthInput     = DIGITS;
            int    lengthMultValue = DIGITS;
            InfInt zero            = new InfInt("0");

            if (this.CompareTo(zero) == 0 || multValue.CompareTo(zero) == 0)
            {
                return(zero);
            }
            //Find lengths of both multiplied values
            while (Integer[DIGITS - lengthInput] == 0)
            {
                if (lengthInput == 0)
                {
                    break;
                }
                lengthInput--;
            }
            while (multValue.Integer[DIGITS - lengthMultValue] == 0)
            {
                if (lengthMultValue == 0)
                {
                    break;
                }
                lengthMultValue--;
            }
            InfInt returnValue = new InfInt();

            //Iterate through each value in one array, multiplying it by each value in the other array
            for (int i = 0; i < lengthMultValue; i++)
            {
                returnValue = returnValue.Add(this.MultiplyThese(multValue.Integer[DIGITS - 1 - i], lengthInput, i));
            }
            //If the multiplied numbers have different signs, the result is negative
            if (this.Positive != multValue.Positive)
            {
                returnValue.Positive = false;
            }
            return(returnValue);
        }
 //-1 == Less than, 0 == Equal to, 1 == Greater than, -2 == Invalid Input
 public int CompareTo(object obj)
 {
     if (obj is InfInt)
     {
         InfInt input = (InfInt)obj;
         if (Positive != input.Positive)
         {
             if (Positive)
             {
                 return(1);
             }
             return(-1);
         }
         int i = 0;
         while (i < DIGITS)
         {
             if (Integer[i] > input.Integer[i])
             {
                 if (Positive)
                 {
                     return(1);
                 }
                 return(-1);
             }
             else if (Integer[i] < input.Integer[i])
             {
                 if (Positive)
                 {
                     return(-1);
                 }
                 return(1);
             }
             i++;
         }
         return(0);
     }
     //Return -2 if input is not of type InfInt
     Console.WriteLine("Oops! Input was not of type InfInt!");
     return(-2);
 }
        //Figures out what function needs to be done in order to subtract 2 InfInt's
        public InfInt Subtract(InfInt subtractValue)
        {
            InfInt temp = new InfInt(); // temporary result

            // subtractValue is negative
            if (Positive && (!subtractValue.Positive))
            {
                temp = AddPositives(subtractValue);
            }
            // this InfInt is negative
            else if (!Positive && subtractValue.Positive)
            {
                temp = AddPositives(subtractValue);
            }
            // at this point, both InfInts have the same sign
            else
            {
                bool isPositive     = Positive; // original sign
                bool resultPositive = Positive; // sign of the result

                // set both to positive so we can compare absolute values
                Positive = true;
                subtractValue.Positive = true;
                if (this.IsGreaterThan(subtractValue))
                {
                    temp = this.SubtractPositives(subtractValue);
                }
                else
                {
                    temp           = subtractValue.SubtractPositives(this);
                    resultPositive = !isPositive; // flip the sign
                }

                Positive = isPositive;
                subtractValue.Positive = isPositive;
                temp.Positive          = resultPositive;
            }

            return(temp);
        }