110,566
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
string s = "6/?=2";
string[] nums = Regex.Split(s, @"(?<=[^+\-*\/=]+)[+\-*\/\=]").ToArray();
int xpos = nums.ToList().FindIndex(x => x == "?");
string op = Regex.Match(s, @"(?<=[\d\?])[+\-*\/](?=[\d\?])").Value;
var calcList = new List<Dictionary<string, Func<int, int, int>>>()
{
new Dictionary<string, Func<int, int, int>>()
{
{ "+", new Func<int, int, int>((y, z) => z - y) },
{ "-", new Func<int, int, int>((y, z) => z + y) },
{ "*", new Func<int, int, int>((y, z) => z / y) },
{ "/", new Func<int, int, int>((y, z) => z * y) }
},
new Dictionary<string, Func<int, int, int>>()
{
{ "+", new Func<int, int, int>((x, z) => z - x) },
{ "-", new Func<int, int, int>((x, z) => x - z) },
{ "*", new Func<int, int, int>((x, z) => z / x) },
{ "/", new Func<int, int, int>((x, z) => x / z) }
},
new Dictionary<string, Func<int, int, int>>()
{
{ "+", new Func<int, int, int>((x, y) => x + y) },
{ "-", new Func<int, int, int>((x, y) => x - y) },
{ "*", new Func<int, int, int>((x, y) => x * y) },
{ "/", new Func<int, int, int>((x, y) => x / y) }
}
};
nums = nums.Where(x => x != "?").ToArray();
int result = calcList[xpos][op](int.Parse(nums[0]), int.Parse(nums[1]));
Console.WriteLine(result);
}
}
}
namespace Demo
{
class Program
{
static void Main(string[] args)
{
string[] test =
{
"3*6=?",
"6+?=10",
"4-5=?",
"?-5=-4"
};
foreach (string expression in test)
{
Console.Write(expression + "\t");
Console.WriteLine("?=" + ParseExpression(expression));
}
Console.ReadLine();
}
static int ParseExpression(string expression)
{
Dictionary<string, ICalculate> exps =new Dictionary<string, ICalculate>();
exps.Add("+", new Add());
exps.Add("-", new Sub());
exps.Add("*", new Mul());
exps.Add("/", new Div());
var vars = expression.Split(new char[] { '+', '-', '/', '*','='}).Where(a => a != "").ToArray();
string op = Regex.Match(expression, @"[+\-*\/]").Value;
return exps[op].Cal(vars[0], vars[1], expression.Split('=').Last());
}
}
public interface ICalculate
{
int Cal(string op1, string op2, string op3);
}
public class Add : ICalculate
{
public int Cal(string op1, string op2, string op3)
{
if (op1 == "?")
return int.Parse(op3) - int.Parse(op2);
if (op2 == "?")
return int.Parse(op3) - int.Parse(op1);
if (op3 == "?")
return int.Parse(op1) + int.Parse(op2);
return 0;
}
}
public class Sub : ICalculate
{
public int Cal(string op1, string op2, string op3)
{
if (op1 == "?")
return int.Parse(op3) + int.Parse(op2);
if (op2 == "?")
return int.Parse(op3) + int.Parse(op1);
if (op3 == "?")
return int.Parse(op1) - int.Parse(op2);
return 0;
}
}
public class Mul : ICalculate
{
public int Cal(string op1, string op2, string op3)
{
if (op1 == "?")
return int.Parse(op3) / int.Parse(op2);
if (op2 == "?")
return int.Parse(op3) / int.Parse(op1);
if (op3 == "?")
return int.Parse(op1) * int.Parse(op2);
return 0;
}
}
public class Div : ICalculate
{
public int Cal(string op1, string op2, string op3)
{
if (op1 == "?")
return int.Parse(op3) * int.Parse(op2);
if (op2 == "?")
return int.Parse(op3) * int.Parse(op1);
if (op3 == "?")
return int.Parse(op1) / int.Parse(op2);
return 0;
}
}
}
static String GetResult(String input)
{
String result = "?=";
List<String> ops = new List<string> { "+", "-", "*", "/" };
String[] sides = input.Split('=');
if (sides.ToList().Contains("?") || sides.ToList().Contains("-?"))
{
String oneSide = sides.ToList().Where(e => !e.Contains("?")).ElementAt(0);
char op = FindOp(oneSide);
String[] num = oneSide.Split(op);
result += input.Contains("-?") ? (-1 * Op(num, op)).ToString() : Op(num, op).ToString();
}
else
{
String newInput = Exchange(input);
result = GetResult(newInput);
}
return result;
}
static String Exchange(String input)
{
String AfterExchanging = "";
String[] sides = input.Split('=');
String oneSide = sides.ToList().Where(e => e.Contains("?")).ElementAt(0);
String anotherSide = sides.ToList().Where(e => !e.Contains("?")).ElementAt(0);
char op = FindOp(oneSide);
String[] parts = oneSide.Split(op);
if (oneSide.StartsWith("?") || oneSide.StartsWith("-?"))
{
AfterExchanging = parts[0] + "=" + anotherSide + DeOp(op) + parts[1];
return AfterExchanging;
}
else if (oneSide.Contains("/") || op == '-')
{
AfterExchanging = parts[0] + op.ToString() + anotherSide + "=" + parts[1];
return AfterExchanging;
}
else if (op == '*')
{
AfterExchanging = anotherSide + DeOp(op) + parts[0] + "=" + parts[1];
return AfterExchanging;
}
else
{
AfterExchanging = parts[0] + DeOp(op) + anotherSide + "=-" + parts[1];
return AfterExchanging;
}
}
static int Op(String[] num, char op)
{
int result = 0;
switch (op)
{
case '+': result = int.Parse(num[0]) + int.Parse(num[1]); break;
case '-': result = int.Parse(num[0]) - int.Parse(num[1]); break;
case '*': result = int.Parse(num[0]) * int.Parse(num[1]); break;
case '/': result = int.Parse(num[0]) / int.Parse(num[1]); break;
default: break;
}
return result;
}
static String DeOp(char op)
{
String result = "";
switch (op)
{
case '+': result = "-"; break;
case '-': result = "+"; break;
case '*': result = "/"; break;
case '/': result = "*"; break;
default: break;
}
return result;
}
static char FindOp(String s)
{
char op;
if (s.Contains("*"))
{
op = '*';
return op;
}
else if (s.Contains("/"))
{
op = '/';
return op;
}
else if (s.StartsWith("-"))
{
op = s.ToList<char>().Where(n => (n < '0' || n > '9') && n != '?').ElementAt(1);
return op;
}
else
{
op = s.ToList<char>().Where(n => (n < '0' || n > '9') && n != '?').ElementAt(0);
return op;
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
string s = "5*10=?";
string[] nums = s.Split('+', '-', '*', '/', '=');
int xpos = nums.ToList().FindIndex(x => x == "?");
string op = Regex.Match(s, @"[+\-*\/]").Value;
Dictionary<string, Func<int, int, int>> dict1 = new Dictionary<string, Func<int, int, int>>()
{
{ "+", new Func<int, int, int>((x, y) => x + y) },
{ "-", new Func<int, int, int>((x, y) => x - y) },
{ "*", new Func<int, int, int>((x, y) => x * y) },
{ "/", new Func<int, int, int>((x, y) => x / y) }
};
Dictionary<string, Func<int, int, int>> dict2 = new Dictionary<string, Func<int, int, int>>();
dict2.Add("+", dict1["-"]);
dict2.Add("-", dict1["+"]);
dict2.Add("*", dict1["/"]);
dict2.Add("/", dict1["*"]);
nums = nums.Where(x => x != "?").ToArray();
int result = (xpos == 0 || xpos == 1) ?
dict2[op](int.Parse(nums[1]), int.Parse(nums[0])) :
dict1[op](int.Parse(nums[0]), int.Parse(nums[1]));
Console.WriteLine(result);
}
}
}