Заданы 6 цифр и число. Используя скобки и бинарные арифметические операции +,-,*,/, получить заданное число - C#

Узнай цену своей работы

Формулировка задачи:

помогите написать программу на C#, как-нибудь отблагодарю Заданы 6 цифр и число. Используя скобки и бинарные арифметические операции +,-,*,/, получить заданное число, результатом функции должно быть арифметическое выражение в инфиксной форме. Если ответов несколько, вывести а)любой из них б) все ,(Примечание: деление разрешается использовать лишь в том случае, если частное будет целым) пример: (f(8 9 4 3 9 2) 100) (89*(4-3)+9+2) или (89+(4-3)*9+2) или (8*(9+4)-3+9-2)

Решение задачи: «Заданы 6 цифр и число. Используя скобки и бинарные арифметические операции +,-,*,/, получить заданное число»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace ConsoleApplication175
  5. {
  6.     internal class Program
  7.     {
  8.         private static void Main(string[] args)
  9.         {
  10.             var counter = 0;
  11.             var calc = new Solver();
  12.             var list = calc.Solve(100, new int[] {8, 9, 4, 3, 9, 2});
  13.             foreach (var solution in list)
  14.             {
  15.                 Console.WriteLine(solution);
  16.                 counter++;
  17.                 if (counter >= 100)
  18.                 {
  19.                     Console.WriteLine("Found 100 solutions. Continue? (y/n)");
  20.                     switch ((char) Console.Read())
  21.                     {
  22.                         case 'y':
  23.                         case 'Y':
  24.                             continue;
  25.                         default:
  26.                             break;
  27.                     }
  28.                     counter = 0;
  29.                 }
  30.             }
  31.             Console.ReadLine();
  32.         }
  33.     }
  34.  
  35.     class Solver
  36.     {
  37.         public IEnumerable<string> Solve(int target, params int[] arguments)
  38.         {
  39.             //генерируем всевозможные перестановки аргументов
  40.             foreach (var permutation in GetPermutations(arguments, 0, arguments.Length - 1))
  41.             //генерируем всевозможные объединения цифр в числа
  42.             foreach (var union in GetUnions(arguments))
  43.             {
  44.                 var calc = new Calculator(union);
  45.                 //генерируем всевозможные операции над аргументами, вычисляем результат
  46.                 foreach (var res in calc.CalcVariants())
  47.                     if (res == target)
  48.                         yield return calc.ExpressionStack.Peek();
  49.             }
  50.         }
  51.  
  52.         IEnumerable<IList<int>> GetUnions(IList<int> arr)
  53.         {
  54.             var res = new List<int>();
  55.             return GetUnions(arr, 0, res);
  56.         }
  57.  
  58.         IEnumerable<IList<int>> GetUnions(IList<int> arr, int from, IList<int> res)
  59.         {
  60.             if (from >= arr.Count)
  61.                 yield return res;
  62.  
  63.             for(int i=from; i < arr.Count;i++)
  64.             {
  65.                 res.Add(Union(arr, from, i));
  66.                 foreach (var r in GetUnions(arr, i + 1, res))
  67.                     yield return r;
  68.                 res.RemoveAt(res.Count - 1);
  69.             }
  70.         }
  71.  
  72.         int Union(IList<int> arr, int from, int to)
  73.         {
  74.             var res = arr[from];
  75.             for (int i = from + 1; i <= to; i++)
  76.                 res = Union(res, arr[i]);
  77.  
  78.             return res;
  79.         }
  80.  
  81.         int Union(int a, int b)
  82.         {
  83.             if (b == 0)
  84.                 return a*10;
  85.             return a*(int)Math.Pow(10, 1 + (int)Math.Log10(b)) + b;
  86.         }
  87.  
  88.         IEnumerable<IList<int>> GetPermutations(IList<int> arr, int i, int n)
  89.         {
  90.             int j;
  91.             if (i == n)
  92.                 yield return arr;
  93.             else
  94.             {
  95.                 for (j = i; j <= n; j++)
  96.                 {
  97.                     Swap(arr, i, j);
  98.                     foreach(var p in GetPermutations(arr, i + 1, n))
  99.                         yield return p;
  100.                     Swap(arr, i, j);
  101.                 }
  102.             }
  103.         }
  104.  
  105.         void Swap(IList<int> arr, int i, int j)
  106.         {
  107.             int tmp = arr[i];
  108.             arr[i] = arr[j];
  109.             arr[j] = tmp;
  110.         }
  111.     }
  112.  
  113.     class Calculator
  114.     {
  115.         public StackWithUndo<int> Stack = new StackWithUndo<int>();
  116.         public StackWithUndo<string> ExpressionStack = new StackWithUndo<string>();
  117.         public StackWithUndo<int> Arguments;
  118.         public string Solution = "";
  119.  
  120.         private readonly Func<bool>[] AllowedOperations;
  121.  
  122.         public Calculator(IList<int> arguments)
  123.         {
  124.             Arguments = new StackWithUndo<int>(arguments);
  125.             AllowedOperations = new Func<bool>[] { Up, Add, Sub, Mul, Div };
  126.         }
  127.  
  128.         public IEnumerable<int> CalcVariants()
  129.         {
  130.             if (Stack.Count == 1)
  131.                 yield return Stack.Peek();
  132.  
  133.             var argState = Arguments.RememberState();
  134.             var stackState = Stack.RememberState();
  135.             var expressionState = ExpressionStack.RememberState();
  136.             var s = Solution;
  137.  
  138.             foreach(var op in AllowedOperations)
  139.             {
  140.                 if (op())
  141.                     foreach (var res in CalcVariants())
  142.                         yield return res;
  143.  
  144.                 Stack.RestoreState(stackState);
  145.                 Arguments.RestoreState(argState);
  146.                 ExpressionStack.RestoreState(expressionState);
  147.                 Solution = s;
  148.             }
  149.         }
  150.  
  151.  
  152.         bool Up()
  153.         {
  154.             if(Arguments.Count > 0)
  155.             {
  156.                 var arg = Arguments.Pop();
  157.                 ExpressionStack.Push(arg.ToString());
  158.                 Stack.Push(arg);
  159.                 return true;
  160.             }
  161.  
  162.             return false;
  163.         }
  164.  
  165.         bool Add()
  166.         {
  167.             if (Stack.Count > 1)
  168.             {
  169.                 var arg1 = Stack.Pop();
  170.                 var arg2 = Stack.Pop();
  171.                 ExpressionStack.Push(string.Format("({1}+{0})", ExpressionStack.Pop(), ExpressionStack.Pop()));
  172.                 Stack.Push(arg2 + arg1);
  173.                 return true;
  174.             }
  175.  
  176.             return false;
  177.         }
  178.  
  179.         bool Sub()
  180.         {
  181.             if (Stack.Count > 1)
  182.             {
  183.                 var arg1 = Stack.Pop();
  184.                 var arg2 = Stack.Pop();
  185.                 ExpressionStack.Push(string.Format("({1}-{0})", ExpressionStack.Pop(), ExpressionStack.Pop()));
  186.                 Stack.Push(arg2 - arg1);
  187.                 return true;
  188.             }
  189.  
  190.             return false;
  191.         }
  192.  
  193.         bool Mul()
  194.         {
  195.             if (Stack.Count > 1)
  196.             {
  197.                 var arg1 = Stack.Pop();
  198.                 var arg2 = Stack.Pop();
  199.                 ExpressionStack.Push(string.Format("{1}*{0}", ExpressionStack.Pop(), ExpressionStack.Pop()));
  200.                 Stack.Push(arg2 * arg1);
  201.                 return true;
  202.             }
  203.  
  204.             return false;
  205.         }
  206.  
  207.         bool Div()
  208.         {
  209.             if (Stack.Count > 1)
  210.             {
  211.                 var arg1 = Stack.Pop();
  212.                 var arg2 = Stack.Pop();
  213.                 if (arg1 != 0 && (arg2 % arg1 == 0))
  214.                 {
  215.                     ExpressionStack.Push(string.Format("{1}/{0}", ExpressionStack.Pop(), ExpressionStack.Pop()));
  216.                     Stack.Push(arg2/arg1);
  217.                     return true;
  218.                 }
  219.                 Stack.Push(arg2);
  220.                 Stack.Push(arg1);
  221.             }
  222.  
  223.             return false;
  224.         }
  225.     }
  226.  
  227.     class StackWithUndo<T>: Stack<T>
  228.     {
  229.         public StackWithUndo()
  230.         {
  231.         }
  232.  
  233.         public StackWithUndo(IEnumerable<T> coll) : base(coll)
  234.         {
  235.         }
  236.  
  237.         public List<T> RememberState()
  238.         {
  239.             return new List<T>(this);
  240.         }
  241.  
  242.         public void RestoreState(List<T> state)
  243.         {
  244.             base.Clear();
  245.             for (int i = state.Count - 1; i >= 0;i--)
  246.                 base.Push(state[i]);
  247.         }
  248.     }
  249. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.462 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы