namespace Google方程式
{
class Program
{
const int NUMBER_MIN = 0;
const int NUMBER_MAX = 9;
static List<CharNumber[]> result = new List<CharNumber[]>();
static string strTrim;
static void Main(string[] args)
{
string str = "WWWDOT - GOOGLE = DOTCOM";//777589 - 188103 = 589486; 777589 - 188106 = 589483
strTrim = str.Replace(" ", "");
List<CharItem> charItemList = InitCharItemList(strTrim);
Number[] numList = InitNumberList();
Console.WriteLine("获取数据中......");
GetAllItems(numList, charItemList,charItemList.Count);
Console.WriteLine("数据获取完毕\n数据检测中......");
WriteTrueItem(strTrim);
Console.WriteLine("数据检测完毕");
Console.ReadLine();
}
/// <summary>
/// 输出正确项
/// </summary>
/// <param name="strTrim">方程式(去除空格)</param>
private static void WriteTrueItem(string strTrim)
{
List<string> rlist = new List<string>();
for(int i=0,len = result.Count;i<len;i++)
{
string str = strTrim;
foreach (CharNumber item in result[i])
{
str = str.Replace("" + item.ch, "" + item.num);
}
string[] strs = str.Split('=');
int? sum1 = Calculate(strs[0]);
int? sum2 = Calculate(strs[1]);
if (sum2 == 589483)
{
}
if (sum1 != null && sum2 != null && sum1 == sum2)
{
rlist.Add(str);
Console.WriteLine(str);
}
}
}
/// <summary>
/// 计算方程式
/// </summary>
/// <param name="str">方程式等号的其中一边</param>
/// <returns></returns>
private static int? Calculate(string str)
{
char[] strs = str.ToCharArray();
int num = 0;int? sum = 0; char ch = '=';
for (int i = 0, len = strs.Length; i < len; i++)
{
if (strs[i] >= '0' && strs[i] <= '9')
{
num = num * 10 + Convert.ToInt32("" + strs[i]);
if (i==len-1)//当最后一个字符是数字时,应该执行运算
{
if (ch == '=')
{
sum += num;
}
else
{
sum = Calculate(ch, sum, num);
if (sum == null) return sum;
}
}
}
else//方程式中不考虑除+ - * / =五个符号之外的任何符号,且=只允许一个
{
if (ch != '=')//当之前已经出现了一个运算符号时,应该将前一步运算完成
{
sum = Calculate(ch, sum, num);
if (sum == null) return sum;
ch = '='; //恢复原状
}
else
{
ch = strs[i];
sum += num;
}
num = 0;
}
}
return sum;
}
/// <summary>
/// 计算
/// </summary>
/// <param name="ch">运算符号</param>
/// <param name="sum">累计结果</param>
/// <param name="num">数</param>
/// <returns>累计结果和数的运算结果</returns>
private static int? Calculate(char ch,int? sum,int num)
{
switch (ch)
{
case '+': sum = sum + num; break;
case '-': sum = sum - num; break;
case '*': sum = sum * num; break;
case '/':
if (num == 0 || sum % num != 0)//排除除数为0,或不整除的情况
sum = null;
sum = sum / num;
break;
default: sum = null; break;
}
return sum;
}
/// <summary>
/// 获取所有可能项
/// </summary>
/// <param name="numList"></param>
/// <param name="charItemList"></param>
/// <param name="len"></param>
/// <param name="index"></param>
private static void GetAllItems(Number[] numList, List<CharItem> charItemList, int len, int index = 0)
{
if (index == len)
{
result.Add(CIListCopyToCNList(charItemList, len));
return;
}
foreach (Number number in numList)
{
if (number.used) continue;
if (number.num == 0 && charItemList[index].notZero) continue;
charItemList[index].num = number.num;
number.used = true;
GetAllItems(numList, charItemList, len, index + 1);
number.used = false;
}
}
/// <summary>
/// 复制数组信息
/// </summary>
/// <param name="charItemList"></param>
/// <param name="len"></param>
/// <returns></returns>
private static CharNumber[] CIListCopyToCNList(List<CharItem> charItemList,int len)
{
CharNumber[] items = new CharNumber[len];
int i=0;
foreach (CharItem item in charItemList)
{
items[i++] = new CharNumber(item.ch, item.num);
}
return items;
}
/// <summary>
/// 初始化字符数字数组信息
/// </summary>
/// <param name="strTrim">方程式字符串</param>
/// <returns></returns>
private static List<CharItem> InitCharItemList(string strTrim)
{
char[] symbols = new char[] { '+', '-', '*', '/', '=' };
string[] strs = strTrim.Split(symbols);
List<CharItem> list = new List<CharItem>();
foreach (string str in strs)
{
var chars = str.ToCharArray();
for (int i = 0, len = chars.Length; i < len; i++)
{
int num = FindIndex(list, chars[i]);
if (i == 0 && len != 1)//首位字符,且字符数只有一个,则该字符可以为0
{
if (num == -1)
{
list.Add(new CharItem(chars[i], true));
}
else
{
list[num].notZero = true;
}
}
else
{
if (num == -1)
{
list.Add(new CharItem(chars[i]));
}
}
}
}
return list;
}
/// <summary>
/// 在数组中获取相同字符的元素的索引号,没有获取到则返回默认值-1
/// </summary>
/// <param name="list">数组</param>
/// <param name="ch">所查找的字符</param>
/// <returns></returns>
private static int FindIndex(List<CharItem> list, char ch)
{
int result = -1;
for (int i = 0, len = list.Count; i < len; i++)
{
if (list[i].ch == ch)
{
result = i;
break;
}
}
return result;
}
/// <summary>
/// 初始化数字数组信息
/// </summary>
/// <returns></returns>
private static Number[] InitNumberList()
{
int num = NUMBER_MAX - NUMBER_MIN + 1;
Number[] list = new Number[num];
for (int i = NUMBER_MIN; i <= NUMBER_MAX; i++)
{
list[i] = new Number(i);
}
return list;
}
/// <summary>
/// 类-字符数字(包含是否可以为0)
/// </summary>
class CharItem
{
public char ch;
public bool notZero;
public int num;
public CharItem(char ch, bool notZero = false, int num = -1)
{
// TODO: Complete member initialization
this.ch = ch;
this.notZero = notZero;
this.num = num;
}
}
/// <summary>
/// 类-字符数字(不包含是否可以为0)(可要可不要),不用就可以将所有的此类改为CharItem类
/// </summary>
class CharNumber
{
public char ch;
public int num;
public CharNumber(char ch, int num)
{
this.ch = ch;
this.num = num;
}
}
/// <summary>
/// 类-数字
/// </summary>
class Number
{
public int num;
public bool used;
public Number(int num)
{
// TODO: Complete member initialization
this.num = num;
this.used = false;
}
}
}
}