Решить уравнение - C# (181804)
Формулировка задачи:
Написать программу: человек вводит вместо х число, программа показывает все возможны варианты решения(вместо "?" ставит знак "-+*/") если решения нет отобразить этона экране.
(((1?2)?3)?4)?5) = x;
Решение задачи: «Решить уравнение»
textual
Листинг программы
- using System;
- using System.Collections.Generic;
- public class Program
- {
- private static void Main()
- {
- while (true)
- {
- int X ;
- char[] operators = "*/+-".ToCharArray();
- string expression = "(((1?2)?3)?4)?5) = x";
- Console.Write("\nВведите Х (ввод символа - выход): ");
- if (! Int32.TryParse(Console.ReadLine(),out X))
- break;
- do
- {
- string[] strarr = expression.Remove(16).Split('?');
- string exp = String.Concat(strarr[0], operators[0], strarr[1], operators[1], strarr[2], operators[2], strarr[3], operators[3], strarr[4]);
- int res = 0;
- res = Evaluate(exp);
- Console.Write(String.Format("{0} = {1}",exp,res));
- if (res != X)
- Console.Write(" Решения нет.");
- Console.WriteLine();
- } while (NextPermutation(operators));
- }
- Console.ReadKey(true);
- }
- private static void Swap<T>(ref T x, ref T y)
- {
- T temp = x;
- x = y;
- y = temp;
- }
- private static bool NextPermutation(char[] arr)
- {
- int j = 0, k = 0;
- for (j = arr.Length - 2; j != -1 && arr[j] >= arr[j + 1]; j--) ;
- if (j == -1)
- return false;
- for (k = arr.Length - 1; arr[j] >= arr[k]; k--);
- Swap(ref arr[j], ref arr[k]);
- int left = j + 1;
- Array.Reverse(arr, left, arr.Length - left);
- return true;
- }
- private static int Evaluate(string exp)
- {
- Stack<string> stack = new Stack<string>();
- for (int i = 0; i < exp.Length; i++)
- {
- char ch = exp[i];
- if (ch == '(')
- continue;
- else if (ch == ')')
- {
- string right = stack.Pop();
- string op = stack.Pop();
- string left = stack.Pop();
- stack.Push(Calc(left, op, right));
- }
- else if (ch == '+' ||
- ch == '/' ||
- ch == '-' ||
- ch == '*')
- stack.Push(ch.ToString());
- else if (char.IsDigit(ch))
- stack.Push(ch.ToString());
- else
- break;
- }
- return Convert.ToInt32(stack.Peek());
- }
- private static string Calc(string left, string op, string right)
- {
- int l = int.Parse(left);
- int r = int.Parse(right);
- switch (op)
- {
- case "+":
- return (l + r).ToString();
- case "-":
- return (l - r).ToString();
- case "*":
- return (l * r).ToString();
- case "/":
- return (l / r).ToString();
- default:
- throw new ArgumentException();
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д