Пример #1
0
        // END OPERATORS SUPPORT METHODS

        // OTHER

        public static string SuperDivision(BigNumber A, BigNumber B)
        {
            const int max_decimal = 100;

            BigNumber C, D;

            C          = A;
            D          = B;
            C.Negative = false;
            D.Negative = false;
            BigNumber Resto = Quantevolte(C, D);

            if (A.Negative ^ B.Negative)
            {
                Resto.Negative = true;
            }

            string r = Resto.ToString() + ".";

            Resto.Negative = false;
            C -= (Resto * D);

            int     x    = 0;
            Boolean Stop = false;

            while ((x < max_decimal) && (!Stop))
            {
                if (C == 0)
                {
                    Stop = true;
                }
                else
                {
                    C     = C * 10;
                    Resto = Quantevolte(C, D);

                    if (Resto.Number.Count() > 1)
                    {
                        Stop = true;
                    }
                    else
                    {
                        r += Resto.ToString();
                        C -= (Resto * D);
                        x++;
                    }
                }
            }

            return(r);
        }
Пример #2
0
        private void Sub_Click(object sender, EventArgs e)
        {
            try
            {
                BigNumber BN1 = new BigNumber(Primo.Text);
                BigNumber BN2 = new BigNumber(Secondo.Text);

                var watch = Stopwatch.StartNew();

                BN1 = (BN1 - BN2);

                watch.Stop();
                Time.Text = watch.ElapsedMilliseconds.ToString() + " ms";

                Totale.Text = BN1.ToString();
            }
            catch
            {
                MessageBox.Show("Errore");
            }
        }
Пример #3
0
        // END OPERATORS

        // OPERATORS SUPPORT METHODS

        private static BigNumber Quantevolte(BigNumber A, BigNumber B)
        {
            BigNumber counter = new BigNumber("0");

            int Acount = A.Number.Count();
            int Bcount = B.Number.Count();

            //Costante di riduzione dei cicli
            BigNumber moltiplicatore = new BigNumber("10");
            int       riduttore      = 0;

            while (riduttore < (Acount - Bcount - 2))
            {
                riduttore++;
                moltiplicatore *= 10;
            }
            riduttore++;

            BigNumber R;
            BigNumber NB    = B;
            BigNumber conta = new BigNumber("0");

            while (NB.Number.Count() < (Acount - riduttore))
            {
                NB *= moltiplicatore;
                conta++;
            }

            bool is_zero = (conta == 0);

            if (!is_zero)
            {
                int y = Convert.ToInt32(conta.ToString());
                conta = new BigNumber("1");
                for (int x = 0; x < y; x++)
                {
                    conta *= moltiplicatore;
                }
            }

            R = A;
            while (!(R = (R - NB)).Negative)
            {
                counter++;
            }

            R = A - (NB * counter);
            if (!is_zero)
            {
                counter *= conta;
            }

            BigNumber S = R;

            while (B.Number.Count() < R.Number.Count())
            {
                S        = Quantevolte(R, B);
                counter += S;
                R        = A - (counter * B);
            }

            //ultime cifre
            while (!(R = (R - B)).Negative)
            {
                counter++;
            }

            return(counter);
        }