看了这个帖子学习的,方法和原理已经搞清了,不过如果要求再严格一点,恐怕就没这么简单了.传送门在此
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace MyConsoleLab
{
class Program
{
delegate float Operation(float num1,float num2);
static Dictionary<int, Operation> Opera = new Dictionary<int, Operation>()
{
{ 0,(x, y) => x + y },
{ 1,(x, y) => x - y },
{ 2,(x, y) => x * y },
{ 3,(x, y) => x / y }
};
static Dictionary<int, string> Translate = new Dictionary<int, string>()
{
{0,"+" },{1,"-" },{2,"*" },{3,"/" }
};
static int count = 0;
static void Main()
{
ForeachNumbers();
Console.WriteLine("program completed! {0} results!",count);
Console.ReadKey();
}
private static void ForeachNumbers()
{
for (int num1 = 1; num1 <= 13; num1++)
{
for (int num2 = 1; num2 <= 13; num2++)
{
for (int num3 = 1; num3 <= 13; num3++)
{
for (int num4 = 1; num4 <= 13; num4++)
{
ForeachOperations(num1, num2, num3, num4);
}
}
}
}
}
private static void ForeachOperations(int num1, int num2, int num3, int num4)
{
for (int op1 = 0; op1 < 4; op1++)
{
for (int op2 = 0; op2 < 4; op2++)
{
for (int op3 = 0; op3 < 4; op3++)
{
PrintResults(num1, num2, num3, num4, op1, op2, op3);
}
}
}
}
private static void PrintResults(int num1, int num2, int num3, int num4, int op1, int op2, int op3)
{
//((A @ B) @ C) @ D
if (Opera[op3](Opera[op2](Opera[op1](num1, num2), num3), num4) == 24)
{
Console.WriteLine("(({0} {4} {1}) {5} {2}) {6} {3}",
num1, num2, num3, num4, Translate[op1], Translate[op2], Translate[op3]);
count++;
}
//(A @ B) @ (C @ D)
if (Opera[op2](Opera[op1](num1, num2), Opera[op3](num3, num4)) == 24)
{
Console.WriteLine("({0} {4} {1}) {5} ({2} {6} {3})",
num1, num2, num3, num4, Translate[op1], Translate[op2], Translate[op3]);
count++;
}
//(A @ (B @ C)) @ D
if (Opera[op3](Opera[op1](num1, Opera[op2](num2, num3)), num4) == 24)
{
Console.WriteLine("({0} {4} ({1} {5} {2}) {6} {3}",
num1, num2, num3, num4, Translate[op1], Translate[op2], Translate[op3]);
count++;
}
//A @ ((B @ C) @ D)
if (Opera[op1](num1, Opera[op3](Opera[op2](num2, num3), num4)) == 24)
{
Console.WriteLine("{0} {4} (({1} {5} {2}) {6} {3})",
num1, num2, num3, num4, Translate[op1], Translate[op2], Translate[op3]);
count++;
}
//A @ (B @ (C @ D))
if (Opera[op3](num1, Opera[op2](num2, Opera[op3](num3, num4))) == 24)
{
Console.WriteLine("{0} {4} ({1} {5} ({2} {6} {3}))",
num1, num2, num3, num4, Translate[op1], Translate[op2], Translate[op3]);
count++;
}
}
}
}
其实很多方法都是重复的,里面涉及了 中缀式,后缀式,逆波兰时的相关知识.有时间详细讲下吧.