Решить уравнение - 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();
}
}
}