public static LongArifmetik Parse(string x) { var temp = new LongArifmetik(x.Length); temp.num = x.ToCharArray(); Array.Reverse(temp.num); return(temp); }
public static LongArifmetik operator -(LongArifmetik a, int bb) { LongArifmetik b = new LongArifmetik(bb.ToString()); if (b.num.Length > a.num.Length) { Console.WriteLine("Вычитаемое больше уменьшаемого, что не допустимо."); return(null); } if (b.num.Length < a.num.Length) { for (int i = b.num.Length; i < a.num.Length; i++) { Array.Resize(ref b.num, b.num.Length + 1); b.num[i] = '0'; } } for (int i = a.num.Length - 1; i >= 0; i--) { bool flag = false; if (a.num[i] > b.num[i]) { break; } if (a.num[i] < b.num[i]) { flag = true; Console.WriteLine("Вычитаемое больше уменьшаемого, что не допустимо."); } if (flag == true) { return(null); } } LongArifmetik c = new LongArifmetik(a.num.Length); int s = 0; for (int i = 0; i < a.num.Length; i++) { int temp = (int)Char.GetNumericValue(a.num[i]) - (int)Char.GetNumericValue(b.num[i]) + s; s = (int)Math.Round(temp / 10.0, MidpointRounding.ToNegativeInfinity); if (temp < 0) { temp += 10; } c.num[i] = Char.Parse(Convert.ToString(temp)); } return(c); }
static public void print(LongArifmetik a) { if (a == null) { Console.WriteLine("Произошла ошибка"); return; } for (int i = a.num.Length - 1; i >= 0; i--) { Console.Write(a.num[i]); } Console.WriteLine(); }
public static void StatisticPower(LongArifmetik a, LongArifmetik b) { var stw = new Stopwatch(); LongArifmetik c; stw.Start(); for (int i = 0; i < 1000; i++) { c = LongArifmetik.FastPow(a, b); } stw.Stop(); Console.WriteLine("Время возведения в степень: " + stw.ElapsedMilliseconds / 1000.0); }
public static void Statistic(LongArifmetik a, LongArifmetik b) { var stw = new Stopwatch(); LongArifmetik c; stw.Start(); for (int i = 0; i < 1000; i++) { c = a + b; } stw.Stop(); Console.WriteLine("Время выполнения сложения: " + stw.ElapsedMilliseconds / 1000.0); stw.Restart(); for (int i = 0; i < 1000; i++) { c = a - b; if (c == null) { break; } } stw.Stop(); Console.WriteLine("Время выполнения вычитания: " + stw.ElapsedMilliseconds / 1000.0); stw.Restart(); for (int i = 0; i < 1000; i++) { c = a * b; } stw.Stop(); Console.WriteLine("Время выполнения умножения: " + stw.ElapsedMilliseconds / 1000.0); stw.Restart(); for (int i = 0; i < 1000; i++) { c = a / b; if (c == null) { break; } } stw.Stop(); Console.WriteLine("Время выполнения деления: " + stw.ElapsedMilliseconds / 1000.0); }
public static LongArifmetik operator *(LongArifmetik a, int b) { LongArifmetik b_ = new LongArifmetik(b.ToString()); if (b_.num.Length > a.num.Length) { char[] temp = a.num; a.num = b_.num; b_.num = temp; } var c = new LongArifmetik(2 * a.num.Length); //char[] c = new char[a.num.Length]; for (int i = 0; i < a.num.Length; i++) { c.num[i] = '0'; } for (int i = 0; i < a.num.Length; i++) { int s = 0; for (int j = 0; j < b_.num.Length; j++) { int t = 0; t = (int)Char.GetNumericValue(c.num[i + j]) + (int)Char.GetNumericValue(a.num[i]) * (int)Char.GetNumericValue(b_.num[j]) + s; c.num[i + j] = Char.Parse(Convert.ToString(t % 10)); s = t / 10; } c.num[i + b_.num.Length] = Char.Parse(Convert.ToString(s)); } for (int i = c.num.Length - 1; i >= 0; i--) { if (c.num[i] == '\0') { Array.Resize(ref c.num, c.num.Length - 1); } else { break; } } return(c); }
public static LongArifmetik FastPow(LongArifmetik a, LongArifmetik n) { var result = new LongArifmetik("1"); while (n > 0) { var tempN = n % 2; if (tempN.num[0] == '0') { a = a * a; n = n / 2; } else { result = result * a; n = n - 1; } } return(result); }
public static LongArifmetik operator %(LongArifmetik a, LongArifmetik b) { if (b.num.Length == 0) { Console.WriteLine("Делитель не введен."); return(null); } bool errorFlag = true; for (int i = 0; i < b.num.Length; i++) { if (b.num[i] != '0') { errorFlag = false; break; } } if (errorFlag == true) { Console.WriteLine("На ноль делить нельзя."); return(null); } //if (b > a) //{ // Console.WriteLine("Делитель больше делимого. Ответ 0."); // var e = new LongArifmetik("0"); // return e; //} var tempA = new LongArifmetik(0); var q = new LongArifmetik(0); for (int i = a.num.Length - 1; i >= 0; i--) { int divisor = 0; tempA.PushBack(a.num[i]); if (!(tempA > 0)) { q.PushBack('0'); continue; } if (tempA < b && q.num.Length != 0) { q.PushBack('0'); continue; } if (tempA < b) { continue; } while (!(tempA < b)) { tempA = tempA - b; divisor++; } q.PushBack(Convert.ToChar(divisor.ToString())); } for (int i = tempA.num.Length - 1; i > 0; i--) { if (tempA.num[i] == '\0' || tempA.num[i] == '0') { Array.Resize(ref tempA.num, tempA.num.Length - 1); } else { break; } } return(tempA); }
public static LongArifmetik operator *(LongArifmetik a, LongArifmetik b) { bool perest = false; if (b.num.Length > a.num.Length) { char[] temp = a.num; a.num = b.num; b.num = temp; perest = true; } var c = new LongArifmetik(2 * a.num.Length); //char[] c = new char[a.num.Length]; for (int i = 0; i < a.num.Length; i++) { c.num[i] = '0'; } for (int i = 0; i < a.num.Length; i++) { int s = 0; for (int j = 0; j < b.num.Length; j++) { int t = 0; t = (int)Char.GetNumericValue(c.num[i + j]) + (int)Char.GetNumericValue(a.num[i]) * (int)Char.GetNumericValue(b.num[j]) + s; c.num[i + j] = Char.Parse(Convert.ToString(t % 10)); s = t / 10; } c.num[i + b.num.Length] = Char.Parse(Convert.ToString(s)); } for (int i = c.num.Length - 1; i > 0; i--) { if (c.num[i] == '\0' || c.num[i] == '0') { Array.Resize(ref c.num, c.num.Length - 1); } else { break; } } for (int i = a.num.Length - 1; i > 0; i--) { if (a.num[i] == '\0' || a.num[i] == '0') { Array.Resize(ref a.num, a.num.Length - 1); } else { break; } } for (int i = b.num.Length - 1; i > 0; i--) { if (b.num[i] == '\0' || b.num[i] == '0') { Array.Resize(ref b.num, b.num.Length - 1); } else { break; } } if (perest) { char[] temp = a.num; a.num = b.num; b.num = temp; } return(c); }
public static LongArifmetik operator +(LongArifmetik a, LongArifmetik b) { int s = 0; if (b.num.Length > a.num.Length) { for (int i = a.num.Length; i < b.num.Length; i++) { Array.Resize(ref a.num, a.num.Length + 1); a.num[i] = '0'; } } else { for (int i = b.num.Length; i < a.num.Length; i++) { Array.Resize(ref b.num, b.num.Length + 1); b.num[i] = '0'; } } LongArifmetik c = new LongArifmetik(a.num.Length); for (int i = 0; i < a.num.Length; i++) { int temp = (int)Char.GetNumericValue(a.num[i]) + (int)Char.GetNumericValue(b.num[i]) + s; s = temp / 10; c.num[i] = Char.Parse(Convert.ToString(temp % 10)); } if (s == 1) { Array.Resize(ref c.num, c.num.Length + 1); c.num[c.num.Length - 1] = Char.Parse(Convert.ToString(s)); } for (int i = a.num.Length - 1; i > 0; i--) { if (a.num[i] == '\0' || a.num[i] == '0') { Array.Resize(ref a.num, a.num.Length - 1); } else { break; } } for (int i = b.num.Length - 1; i > 0; i--) { if (b.num[i] == '\0' || b.num[i] == '0') { Array.Resize(ref b.num, b.num.Length - 1); } else { break; } } for (int i = c.num.Length - 1; i > 0; i--) { if (c.num[i] == '\0' || c.num[i] == '0') { Array.Resize(ref c.num, c.num.Length - 1); } else { break; } } return(c); }
static void Main(string[] args) { //LongArifmetik f, d; LongArifmetik first = null, second = null; do { Console.Write("Выберите откуда будут считаны числа:\n" + "1. Считать из файла.\n" + "2. Считать с клавиатуры.\n" + "Ваш выбор: "); string yourChoice; while (true) { yourChoice = Console.ReadLine(); if (yourChoice == "1" || yourChoice == "2") { break; } else { Console.WriteLine("Неправильно сделан выбор. Повторите попытку."); } } switch (yourChoice) { case "1": Console.Write("В файле должны находиться два числа, каждое с новой строки.Первое число на первой строке.\n" + "Уккажите адрес файла: "); string FilePath; do { FilePath = @Console.ReadLine(); if (!File.Exists(FilePath)) { Console.WriteLine("Указанный файл не существует.\nПовторите ввод."); } } while (!File.Exists(FilePath)); string x; do { Console.WriteLine("Нажмите Enter для продолжения."); while (Console.ReadKey().Key != ConsoleKey.Enter) { ; } var reader = new StreamReader(FilePath); x = reader.ReadLine(); if (CorrectEntry(x)) { first = LongArifmetik.Parse(x); } else { Console.WriteLine("Некорекктный ввод числа."); reader.Dispose(); reader.Close(); continue; } x = reader.ReadLine(); if (CorrectEntry(x)) { second = LongArifmetik.Parse(x); } else { Console.WriteLine("Исправьте числа в файле."); } reader.Dispose(); reader.Close(); } while (!CorrectEntry(x)); break; case "2": do { Console.WriteLine("Введите первое число: "); x = Console.ReadLine(); if (CorrectEntry(x)) { first = LongArifmetik.Parse(x); } else { Console.WriteLine("Некорекктный ввод числа." + " Повторите попытку ввода."); } } while (!CorrectEntry(x)); do { Console.WriteLine("Введите второе число: "); x = Console.ReadLine(); if (CorrectEntry(x)) { second = LongArifmetik.Parse(x); } else { Console.WriteLine("Некоректный ввод числа." + " Повторите попытку ввода."); } } while (!CorrectEntry(x)); break; default: Console.WriteLine("Неправильно сделан выбор. Повторите попытку."); break; } LongArifmetik sum = first + second, multi = first * second; Console.WriteLine("Результатожения:\n\t" + sum); Console.WriteLine("\nРезультат вычитания:\n\t"); LongArifmetik subtract = first - second; Console.WriteLine(subtract); Console.WriteLine("\nРезультат умножения:\n\t" + multi); Console.WriteLine("\nРезультат деления:\n\t"); LongArifmetik div = first / second; Console.WriteLine(div); var writer = new StreamWriter(@"D:\result.txt"); writer.WriteLine("Результат сложения:\n\t" + sum); writer.Write("\nРезультат вычитания:\n\t"); writer.WriteLine(subtract); writer.WriteLine("\nРезультат умножения:\n\t" + multi); writer.Write("\nРезультат деления:\n\t"); writer.WriteLine(div); Console.Write("Если хотите посмотреть время за которое выполняются операции нажмите v.\nВвод: "); if (Console.ReadLine() == "v") { LongArifmetik.Statistic(first, second); } Console.Write("Показать результат возведения в степень. Нажмите v.\nВвод: "); if (Console.ReadLine() == "v") { LongArifmetik pow = LongArifmetik.FastPow(first, second); Console.WriteLine("\nРезультат возведения в степень:\n\t" + pow); writer.WriteLine("\nРезультат возведения в степень:\n\t" + pow); } writer.Dispose(); writer.Close(); Console.Write("Если хотите посмотреть время за которое выполняется операция возведения в степень нажмите v.\nВвод: "); if (Console.ReadLine() == "v") { LongArifmetik.StatisticPower(first, second); } Console.WriteLine("Для выхода нажмите Esc."); } while (Console.ReadKey().Key != ConsoleKey.Escape); }