private static void Main(string[] args) { Console.WriteLine("Input numbers in exexpontntal form (1,3e2 or 0,000023E-23)"); Console.WriteLine("If you want to stop addition press '='\n"); NewDouble a = NewDouble.Empty; do { Console.Write("Input==>"); string text = Console.ReadLine(); if (text == "=") { break; } NewDouble b; try { b = NewDouble.Input(text); } catch (FormatException e) { Console.WriteLine(e.Message); b = NewDouble.Empty; } a = a + b; } while (true); Console.WriteLine($"Result==> {a}"); Console.ReadKey(); }
public static NewDouble Input(string text) { // Type of the number ==> one or more natural digits -> '.' or ',' -> from one to 40 digits -> 'E' or 'e' -> one or more digit Match match = Regex.Match(text, @"^(\d+(?:[\.|,]?\d{1,39})?)(?:[E|e]([+|-]?\d+)?)?$", RegexOptions.Compiled); List <int> nums; int exp; if (match.Success) { // take an numbers before 'E' or 'e' and conver to int list, where separator is '.' or ',' nums = match.Groups[1].Value.Select(s => (int)char.GetNumericValue(s)).ToList(); //If text doesnt contain separator (4e22, or 12e-1)add an separator and zero ( 4e12 ->4,0e12) if (!nums.Contains(-1)) { nums.AddRange(new[] { -1, 0 }); } if (!text.Contains('e') && !text.Contains('E')) { exp = 0; } // Take an numbers after 'E' or 'e' else { exp = int.Parse(match.Groups[2].Value); } } else { throw new FormatException("Invalid format"); } NewDouble result = new NewDouble(exp, nums); result.SetNormalForm(); result.Trim(); return(result); }
public static NewDouble operator +(NewDouble elem1, NewDouble elem2) { int resultExponent = (elem1._exponent + elem2._exponent) / 2; // Set the same exponential in both numbers if (elem1._exponent != elem2._exponent) { elem1.SetExponent(resultExponent); elem2.SetExponent(resultExponent); } //Synchronization of elements in nums int index1 = elem1._nums.IndexOf(-1); int index2 = elem2._nums.IndexOf(-1); while (index1 != index2) { if (index1 > index2) { elem2._nums.Insert(0, 0); index2++; } else { elem1._nums.Insert(0, 0); index1++; } } while (elem1._nums.Count != elem2._nums.Count) { if (elem1._nums.Count > elem2._nums.Count) { elem2._nums.Insert(elem2._nums.Count, 0); } else { elem1._nums.Insert(elem1._nums.Count, 0); } } // Addition int[] resultNums = new int[elem1._nums.Count + 1]; for (int i = elem1._nums.Count - 1; i >= 0; i--) { if (elem1._nums[i] == -1) { if (resultNums[i + 1] != 0) { resultNums[i]++; } resultNums[i + 1] = -1; continue; } resultNums[i + 1] += elem1._nums[i] + elem2._nums[i]; if (resultNums[i + 1] >= 10) { resultNums[i + 1] -= 10; resultNums[i]++; } } NewDouble result = new NewDouble(resultExponent, resultNums); result.SetNormalForm(); return(result); }