/// <summary> /// Calculates GCD for two or more integer numbers. Out parameter returns method execution time /// </summary> /// <param name="method">delegate with target method</param> /// <param name="numberArray">input array</param> /// <returns>great common divisor</returns> private static int CheckConditionsAndFindGCDForTWoNumbers(GCDGetting method, params int[] numberArray) { if (numberArray == null) { throw new ArgumentNullException(); } if (numberArray.Length < 2) { throw new ArgumentException(); } List <int> numbers = new List <int>(); for (int i = 0; i < numberArray.Length; i++) { if (numberArray[i] == 1) { return(1); } if (numberArray[i] != 0) { numbers.Add(numberArray[i]); } } if (numbers.Count == 0) { throw new ArgumentException(); } if (numbers.Count == 1) { return(Math.Abs(numbers[0])); } int gdc = method.Invoke(numbers[0], numbers[1]); for (int i = 2; i < numbers.Count; i++) { if (numbers[i] == 0) { continue; } if (gdc != 1) { gdc = method.Invoke(gdc, numbers[i]); } else { break; } } return(gdc); }
/// <summary> /// Returns GCD for two or more integer numbers /// </summary> /// <param name="numberArray">input array of integer numbers</param> /// <returns>great common divisor</returns> /// <exception cref="ArgumentException"> if both parameters are zero </exception> public static int GetSteinGCD(params int[] numberArray) { GCDGetting method = GetSteinGCDForTwoNumbers; return(CheckConditionsAndFindGCDForTWoNumbers(method, numberArray)); }