• Source
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4.  
    5. namespace Numbers
    6. {
    7. class Program
    8. {
    9. static void Main(string[] args)
    10. {
    11. int[] numbers = Console.ReadLine().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();
    12. int target = int.Parse(Console.ReadLine());
    13. foreach(var expression in GetAllExpressions(numbers, target))
    14. {
    15. Console.WriteLine($"{expression} = {target}");
    16. }
    17. }
    18.  
    19. private static IEnumerable<string> GetAllExpressions(int[] values, int target)
    20. {
    21. for (int i = 0; i < values.Length; ++i)
    22. {
    23. foreach (var expression in GetAllExpressionsOfSize(i, values, new bool[values.Length]))
    24. {
    25. if (expression.Item2 == target)
    26. {
    27. yield return expression.Item1;
    28. }
    29. }
    30. }
    31. }
    32.  
    33. private static IEnumerable<Tuple<string, int>> GetAllExpressionsOfSize(int size, int[] values, bool[] used)
    34. {
    35. if (size == 0)
    36. {
    37. for (int j = 0; j < used.Length; j++)
    38. {
    39. if (used[j])
    40. {
    41. continue;
    42. }
    43.  
    44. used[j] = true;
    45. yield return Tuple.Create(values[j].ToString(), values[j]);
    46. used[j] = false;
    47. }
    48. }
    49.  
    50. for (int i = 0; i < size; i++)
    51. {
    52. foreach (var nodeLeft in GetAllExpressionsOfSize(i, values, used))
    53. {
    54. foreach (var nodeRight in GetAllExpressionsOfSize(size - 1 - i, values, used))
    55. {
    56. if (nodeLeft.Item2 <= nodeRight.Item2)
    57. {
    58. yield return Tuple.Create($"({nodeLeft.Item1}+{nodeRight.Item1})", nodeLeft.Item2 + nodeRight.Item2);
    59.  
    60. if (nodeLeft.Item2 != 1)
    61. {
    62. yield return Tuple.Create($"({nodeLeft.Item1}*{nodeRight.Item1})", nodeLeft.Item2 * nodeRight.Item2);
    63. }
    64. }
    65.  
    66. if (nodeLeft.Item2 - nodeRight.Item2 > 0)
    67. {
    68. yield return Tuple.Create($"({nodeLeft.Item1}-{nodeRight.Item1})", nodeLeft.Item2 - nodeRight.Item2);
    69. }
    70.  
    71. if (nodeRight.Item2 != 1 && nodeLeft.Item2 % nodeRight.Item2 == 0)
    72. {
    73. yield return Tuple.Create($"({nodeLeft.Item1}/{nodeRight.Item1})", nodeLeft.Item2 / nodeRight.Item2);
    74. }
    75. }
    76. }
    77. }
    78. }
    79. }
    80. }
    81.