Ejemplo n.º 1
0
        public void Multiply(BigIntWithUnit elem2)
        {
            if (this == 0 || elem2 == 0)
            {
                Sub(this);
                return;
            }
            if (elem2 == 1)
            {
                return;
            }
            if (this == 1)
            {
                Sub(this);
                Add(elem2);
                return;
            }

            BigIntWithUnit Result     = 0;
            BigIntWithUnit SemiResult = elem2 * _intArray[0];

            SemiResult.ShiftRight(3);
            Result.Add(SemiResult);
            for (int i = 1; i < _intArray.Count; i++)
            {
                SemiResult = elem2 * _intArray[i];
                SemiResult.ShiftLeft((i - 1) * 3);
                Result.Add(SemiResult);
            }
            //There is no this set function :(
            Sub(this);
            Add(Result);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Divides this to elem2 with presision of two digits after comma
        /// </summary>
        public BigIntWithUnit Divide(BigIntWithUnit elem2)
        {
            if (elem2 == 0 || this == 0)
            {
                return(0);
            }
            Trim();
            elem2.Trim();
            if (_intArray.Count - elem2._intArray.Count > 1)
            {
                BigIntWithUnit recursionTemp = (BigIntWithUnit)Clone();
                recursionTemp.ShiftRight(3);
                BigIntWithUnit recursionResult = recursionTemp.Divide(elem2);
                recursionResult.ShiftLeft(3);
                return(recursionResult);
            }
            if (elem2._intArray.Count - _intArray.Count > 1)
            {
                return(0);
            }

            //Actual division by substraction
            //Only need the first two parts because of accuracy
            BigIntWithUnit tempElem1 = 0;
            BigIntWithUnit tempElem2 = 0;

            if (_intArray.Count == elem2._intArray.Count)
            {
                tempElem1.SafeSetPart(0, SafeGetPart(_intArray.Count - 2));
                tempElem1.SafeSetPart(1, SafeGetPart(_intArray.Count - 1));
                tempElem2.SafeSetPart(0, elem2.SafeGetPart(elem2._intArray.Count - 2));
                tempElem2.SafeSetPart(1, elem2.SafeGetPart(elem2._intArray.Count - 1));
            }
            else if (elem2._intArray.Count > _intArray.Count)
            {
                tempElem1.SafeSetPart(0, SafeGetPart(_intArray.Count - 1));
                tempElem2.SafeSetPart(0, elem2.SafeGetPart(elem2._intArray.Count - 2));
                tempElem2.SafeSetPart(1, elem2.SafeGetPart(elem2._intArray.Count - 1));
            }
            else
            {
                tempElem1.SafeSetPart(0, SafeGetPart(_intArray.Count - 2));
                tempElem1.SafeSetPart(1, SafeGetPart(_intArray.Count - 1));
                tempElem2.SafeSetPart(0, elem2.SafeGetPart(elem2._intArray.Count - 1));
            }

            BigIntWithUnit result = 0;
            int            j      = 0;

            if (tempElem2 == 0)
            {
                return(0);
            }
            while (tempElem2 < 100)
            {
                tempElem2.ShiftLeft(1);
                j++;
            }
            for (var i = j; i > -3; i--)
            {
                while (tempElem1 >= tempElem2 && tempElem2 != 0)
                {
                    tempElem1.Sub(tempElem2);
                    result += Math.Pow(10, i);
                }
                var toAdd = (tempElem2.SafeGetPart(1) * 100) % 1000;
                tempElem2.SafeSetPart(1, (ushort)(tempElem2.SafeGetPart(1) / 10));
                tempElem2.SafeSetPart(0, (ushort)(tempElem2.SafeGetPart(0) / 10 + toAdd));
            }

            return(result);
        }