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); }
/// <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); }