Esempio n. 1
0
        static BigInt Division(BigInt divident, BigInt _divider, DivisionMode mode)
        {
            BigInt divider = new BigInt(_divider);

            divider.sign = Sign.plus;
            BigInt quotient = new BigInt();
            BigInt rest     = new BigInt();
            BigInt tmp      = new BigInt();

            tmp.module = divider.module;
            for (int i = 0; i < divident.module.Count(); i++)
            {
                rest.module.Enqueue(divident.module.ElementAt(i));                 // промежуточный остаток
                rest.UnNull();
                // пока промежуточный остаток меньше делителя, пишем к частному 0
                if (rest >= divider)
                {
                    for (int j = 1; j <= 10; j++)               // цикл, формирующий цифры частного
                    {
                        if (rest < tmp)                         // промежуточный остаток меньше делителя*j
                        {
                            quotient.module.Enqueue(j - 1);
                            rest      -= (tmp - divider);
                            tmp.module = divider.module;
                            break;
                        }
                        if (rest == tmp)                         // промежуточный остаток кратный делителю
                        {
                            quotient.module.Enqueue(j);
                            rest.module.Clear();
                            tmp.module = divider.module;
                            break;
                        }
                        tmp += divider;                         // прибавляем сам делитель, пока не станет больше остатка
                    }
                }
                else
                {
                    quotient.module.Enqueue(0);
                }
            }             // цифры делимого заканчиваются и остаток меньше делимого, цикл завершается

            if (divident.sign != _divider.sign)
            {
                quotient.sign = Sign.minus;
                rest.sign     = Sign.minus;
            }

            if (rest.module.Count() == 0)
            {
                rest.module.Enqueue(0);
                rest.sign = Sign.plus;
            }
            if (quotient.module.Count() == 0)
            {
                quotient.module.Enqueue(0);
                rest.sign = Sign.plus;
            }

            if (mode == DivisionMode.quotient)
            {
                return(quotient.UnNull());
            }
            else
            {
                return(rest.UnNull());
            }
        }
Esempio n. 2
0
        static BigInt Division(BigInt divident, BigInt _divider, DivisionMode mode)
        {
            BigInt divider = new BigInt(_divider);
            //test
            DateTime  timestamp1;
            DateTime  timestamp2;
            Stopwatch fastTime2 = new Stopwatch();

            fastTime2.Start();
            timestamp1 = DateTime.Now;
            //endtest
            divider.sign = Sign.plus;
            BigInt quotient = new BigInt();
            BigInt rest     = new BigInt();
            BigInt tmp      = new BigInt();

            tmp.module = divider.module;
            for (int i = 0; i < divident.module.Count(); i++)
            {
                rest.module.Enqueue(divident.module.ElementAt(i));                 // промежуточный остаток
                rest.UnNull();
                // пока промежуточный остаток меньше делителя, пишем к частному 0
                if (rest >= divider)
                {
                    for (int j = 1; j <= 10; j++)               // цикл, формирующий цифры частного
                    {
                        if (rest < tmp)                         // промежуточный остаток меньше делителя*j
                        {
                            quotient.module.Enqueue(j - 1);
                            rest      -= (tmp - divider);
                            tmp.module = divider.module;
                            break;
                        }
                        if (rest == tmp)                         // промежуточный остаток кратный делителю
                        {
                            quotient.module.Enqueue(j);
                            rest.module.Clear();
                            tmp.module = divider.module;
                            break;
                        }
                        tmp += divider;                         // прибавляем сам делитель, пока не станет больше остатка
                    }
                }
                else
                {
                    quotient.module.Enqueue(0);
                }
            }             // цифры делимого заканчиваются и остаток меньше делимого, цикл завершается

            if (divident.sign != _divider.sign)
            {
                quotient.sign = Sign.minus;
            }

            if (rest.module.Count() == 0)
            {
                rest.module.Enqueue(0);
            }
            if (quotient.module.Count() == 0)
            {
                quotient.module.Enqueue(0);
            }

            timestamp2 = DateTime.Now;
            fastTime2.Stop();

            if (mode == DivisionMode.quotient)
            {
                return(quotient);
            }
            else if (mode == DivisionMode.rest)
            {
                return(rest);
            }
            //test
            else
            {
                rest.time     = (timestamp2.Ticks - timestamp1.Ticks);
                rest.fastTime = fastTime2.ElapsedTicks;
                return(rest);
            }
            //endtest
        }