AddUpClient.AddUpWorker.AddUp C# (CSharp) Method

AddUp() public method

public AddUp ( int MinDigit, int MaxDigit, int ItemsToSum, int TargetSum ) : IList
MinDigit int
MaxDigit int
ItemsToSum int
TargetSum int
return IList
            public IList<int> AddUp(int MinDigit, int MaxDigit, int ItemsToSum, int TargetSum) {
                Console.Out.WriteLine("AddUp called to sum {0} items to get {1}", ItemsToSum, TargetSum);
                if (ItemsToSum > 3) {
                    int LeftItemsToSum = ItemsToSum/2;
                    int RightItemsToSum = ItemsToSum - LeftItemsToSum;
                    int LeftTargetSum = TargetSum/2;
                    int RightTargetSum = TargetSum - LeftTargetSum;
                    IList<int> LeftList = AddUp(MinDigit, MaxDigit, LeftItemsToSum, LeftTargetSum);
                    IList<int> RightList = AddUp(MinDigit, MaxDigit, RightItemsToSum, RightTargetSum);
                    List<int> Results = new List<int>();
                    Results.AddRange(LeftList);
                    Results.AddRange(RightList);
                    return Results;
                }
                // 3 or less
                int MinSumWeCanAchieve = ItemsToSum*MinDigit;
                int MaxSumWeCanAchieve = ItemsToSum*MaxDigit;
                if (TargetSum < MinSumWeCanAchieve)
                    throw new ApplicationException("We added up too fast");
                if (TargetSum > MaxSumWeCanAchieve)
                    throw new ApplicationException("We added up too slow");
                //Now we know we can achieve the result -- but it may not be too efficient...
                int[] TrialNumbers = new int[ItemsToSum];
                int MaxIteration = 100000;
                int IterationPrintInterval = 1000;
                int TrialSum;
                bool PrintIteration;
                for (int Iteration = 1; Iteration <= MaxIteration; ++Iteration) {
                    PrintIteration = ((Iteration % IterationPrintInterval) == 0);
                    if (PrintIteration)
                        Console.Out.WriteLine("Iteration {0} attempting to sum {1} numbers to {2}",
                            Iteration, ItemsToSum, TargetSum);
                    TrialSum = 0;
                    for (int j=0; j < ItemsToSum; ++j) {
                        TrialNumbers[j] = RGenerator.Next(MinDigit, MaxDigit + 1);
                        TrialSum += TrialNumbers[j];
                    }
                    if (PrintIteration)
                        ShowArray(string.Format("Iteration: {0}", Iteration), TrialNumbers);
                    if (TrialSum == TargetSum) {    //Yay
                        ShowArray(string.Format("Success in {0} iterations: ", Iteration), TrialNumbers);
                        return new List<int>(TrialNumbers);
                    }
                    //try again....
                }
                throw new ApplicationException(string.Format("Maximum of {0} trials exceeded", MaxIteration));
            }
            private void ShowArray(string Prefix, int[] numbers)

Usage Example

 static void Main() {
     AddUpWorker worker = new AddUpWorker();
     int MinDigit = 1;
     int MaxDigit = 9;
     int ItemsToSum = 30;
     int TargetSum = 150;
     try {
         //Attempt to get a list of pseudo-random list of integers that add up to the target sum
         IList<int> Results = worker.AddUp(MinDigit, MaxDigit, ItemsToSum, TargetSum);
         EvaluateResults(TargetSum, Results);
         Console.ReadLine();
     }
     catch (Exception E) {
         Console.Out.WriteLine("Error: {0}", E.Message);
         return;
     }
 }