예제 #1
0
        public static LargeNumber operator /(LargeNumber l1, LargeNumber l2)
        {
            LargeNumber resultNumber = new LargeNumber();

            LargeNumber zeroNumber = new LargeNumber();

            if (l2.Compare(zeroNumber) == Comparision.Equal)
            {
                D.LogError("Attempted division by zero");
                throw new System.DivideByZeroException();
            }
            else
            {
                if (l2.Compare(l1) == Comparision.Greater)
                {
                    resultNumber.SetUpNumber("0");
                }
                else if (l2.Compare(l1) == Comparision.Equal)
                {
                    resultNumber.SetUpNumber("1");
                }
                else
                {
                    if (l1.numberBreakDown.Count > l2.numberBreakDown.Count + 1)
                    {
                        List <string> l1Abbreviated = new List <string>();
                        for (int i = 0; i <= l2.numberBreakDown.Count; i++)
                        {
                            l1Abbreviated.Add(l1.numberInString[i]);
                        }
                        LargeNumber l1Abb = new LargeNumber();
                        l1Abb.SetUpNumberFromList(l1Abbreviated);
                        LargeNumber result = new LargeNumber();

                        while (l1Abb.Compare(zeroNumber) != Comparision.Equal)
                        {
                            l1Abb = l1Abb - l2;
                            result++;
                            //D.Log("result = "+result.finalNumberWithFormat);
                        }
                        for (int i = l2.numberBreakDown.Count + 1; i < l1.numberBreakDown.Count; i++)
                        {
                            result.numberInString.Add("000");
                        }
                        resultNumber.SetUpNumberFromList(result.numberInString);
                    }
                    else
                    {
//                        D.Log("l1 = "+l1.finalNumberWithFormat+" , l2 = "+l2.finalNumberWithFormat);
                        while (l1.Compare(zeroNumber) != Comparision.Equal && (l1.Compare(l2) == Comparision.Greater || l1.Compare(l2) == Comparision.Equal))
                        {
                            l1 = l1 - l2;
                            resultNumber++;
                        }
                    }
                }
            }
            return(resultNumber);
        }
예제 #2
0
        public static LargeNumber operator *(LargeNumber l1, float l2)
        {
            LargeNumber l = new LargeNumber(l1);

            if (l2 % 1 == 0)
            {
                LargeNumber multiplier = new LargeNumber((int)l2);
                l = l * multiplier;
            }
            else
            {
                int beforeDecimal = (int)l2;
//                D.Log("BEFORE DECIMAL = "+beforeDecimal);
                float afterDecimal = (l2 % 1);
//                D.Log("AFTER DECIMAL = "+afterDecimal);
                string numberDecimal          = l2.ToString(CultureInfo.InvariantCulture);
                int    lengthOfDecimalNumbers = numberDecimal.Substring(numberDecimal.IndexOf(".", StringComparison.Ordinal) + 1).Length;
                afterDecimal = afterDecimal * Mathf.Pow(10, lengthOfDecimalNumbers);
                int    afterDecimalInt = (int)afterDecimal;
                string number          = "" + beforeDecimal + afterDecimalInt;
//                D.Log("Number without decimal = "+number);

                l = l * new LargeNumber(number);
                string numberAfterMultipliaction = "";

                for (int i = l.numberInString.Count - 1; i >= 0; i--)
                {
                    string currentNumber = l.numberInString[i];
                    int    index         = currentNumber.Length - 1;
                    while (index >= 0)
                    {
                        numberAfterMultipliaction += "" + currentNumber[index];
                        index--;
                    }
                }

                if (numberAfterMultipliaction.Length > lengthOfDecimalNumbers)
                {
//                    D.Log("numberAfterMultipliaction = "+numberAfterMultipliaction);
                    string numberAfterTruncation = numberAfterMultipliaction.Substring(lengthOfDecimalNumbers);
                    numberAfterTruncation = numberAfterTruncation.Reverse();
//                    D.Log("Number after truncation = "+numberAfterTruncation);
                    l.SetUpNumber(numberAfterTruncation);
                }
                else
                {
                    l = new LargeNumber();
                }
            }

            return(l);
        }
예제 #3
0
        public static LargeNumber operator -(LargeNumber l1, LargeNumber l2)
        {
            LargeNumber resultNumber = new LargeNumber();

            if (l1.Compare(l2) == Comparision.Lesser || l1.Compare(l2) == Comparision.Equal)
            {
                resultNumber.SetUpNumber("0");
            }
            else
            {
                LargeNumber largerNumber  = new LargeNumber(l1.numberInString);
                LargeNumber smallerNumber = new LargeNumber(l2.numberInString);

                largerNumber.numberBreakDown.Reverse();
                smallerNumber.numberBreakDown.Reverse();

                List <string> resultOfSubtractionString = new List <string>();
                int           carryForwardSubtraction   = 0;
                int           resultOfSubtraction       = 0;

                for (int i = 0; i < smallerNumber.numberBreakDown.Count; i++)
                {
                    resultOfSubtraction = largerNumber.numberBreakDown[i] - smallerNumber.numberBreakDown[i] - carryForwardSubtraction;
//                    D.Log("l1 = "+largerNumber.numberBreakDown[i]+" , l2 = "+smallerNumber.numberBreakDown[i]+" , carryforward = "+carryForwardSubtraction);
                    if (resultOfSubtraction < 0)
                    {
                        resultOfSubtraction *= -1;

                        carryForwardSubtraction = 1;

                        resultOfSubtraction = 1000 - resultOfSubtraction;
                    }
                    else
                    {
                        carryForwardSubtraction = 0;
                    }
//                    D.Log("Carry forward = "+carryForwardSubtraction);
//                    D.Log("result of subtraction = "+resultOfSubtraction);

                    string resultString = "" + resultOfSubtraction;
                    if (resultOfSubtraction < 10)
                    {
                        resultString = "00" + resultString;
                    }
                    else if (resultOfSubtraction < 100)
                    {
                        resultString = "0" + resultString;
                    }
                    resultOfSubtractionString.Add(resultString);
                }

                for (int i = smallerNumber.numberBreakDown.Count; i < largerNumber.numberBreakDown.Count; i++)
                {
                    resultOfSubtraction = largerNumber.numberBreakDown[i] - carryForwardSubtraction;
                    if (resultOfSubtraction < 0)
                    {
                        resultOfSubtraction *= -1;

                        carryForwardSubtraction = 1;

                        resultOfSubtraction = 1000 - resultOfSubtraction;
                    }
                    else
                    {
                        carryForwardSubtraction = 0;
                    }

                    string resultString = "" + resultOfSubtraction;
                    if (resultOfSubtraction < 10)
                    {
                        resultString = "00" + resultString;
                    }
                    else if (resultOfSubtraction < 100)
                    {
                        resultString = "0" + resultString;
                    }
                    resultOfSubtractionString.Add(resultString);
                }

                resultOfSubtractionString.Reverse();
                resultOfSubtractionString[0] = (Mathf.Max(0, resultOfSubtraction)).ToString();

                int indexAfter0 = -1;
                for (int i = 0; i < resultOfSubtractionString.Count; i++)
                {
                    indexAfter0++;
                    if (resultOfSubtractionString[indexAfter0] != "0" &&
                        resultOfSubtractionString[indexAfter0] != "000")
                    {
                        break;
                    }
                }
//                D.Log("indexAfter0 = "+indexAfter0);
                List <string> rectifiedResultOfSubtractionString = new List <string>();
                for (int i = indexAfter0; i < resultOfSubtractionString.Count; i++)
                {
                    rectifiedResultOfSubtractionString.Add(resultOfSubtractionString[i]);
                }

                resultOfSubtractionString = rectifiedResultOfSubtractionString;

                string firstValue = resultOfSubtractionString[0];
                int    index      = -1;
                for (int i = 0; i < firstValue.Length; i++)
                {
                    if (firstValue[i] == '0')
                    {
                        index++;
                    }
                    else
                    {
                        break;
                    }
                }
//                D.Log("index = "+index);

                if (index >= 0)
                {
                    string rectifiedFirstValue = "";
                    for (int i = index + 1; i < firstValue.Length; i++)
                    {
                        rectifiedFirstValue += firstValue[i];
                    }
                    resultOfSubtractionString[0] = rectifiedFirstValue;
                }

                resultNumber.SetUpNumberFromList(resultOfSubtractionString);
            }

            return(resultNumber);
        }