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