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