1,问题描述:在下面的算式中,添加“+”、“-”,“*”,“/”,4个运算符,使得这个式子成立。
5 5 5 5 5=5,不用枚举算法解决,用别的算法解决,求代码
递归解决
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace Q760027
{
class Program
{
static IEnumerable<string> solve(string s, int[] v, int t)
{
if (v.Length == 2)
{
if (v[0] + v[1] == t) yield return s + "+";
if (v[0] - v[1] == t) yield return s + "-";
if (v[0] * v[1] == t) yield return s + "*";
if (v[1] != 0 && v[0] % v[1] == 0) { if (v[0] / v[1] == t) yield return s + "/"; }
yield break;
}
foreach (var item in solve(s + "+", new int[] { v[0] + v[1] }.Concat(v.Skip(2)).ToArray(), t))
yield return item;
foreach (var item in solve(s + "-", new int[] { v[0] - v[1] }.Concat(v.Skip(2)).ToArray(), t))
yield return item;
foreach (var item in solve(s + "*", new int[] { v[0] * v[1] }.Concat(v.Skip(2)).ToArray(), t))
yield return item;
if (v[1] != 0 && v[0] % v[1] == 0)
{
foreach (var item in solve(s + "/", new int[] { v[0] / v[1] }.Concat(v.Skip(2)).ToArray(), t))
yield return item;
}
}
static void Main(string[] args)
{
foreach (string s in solve("", new int[] { 5, 5, 5, 5, 5 }, 5).Where(x => !Regex.IsMatch(x, @"[\+\-][\*\/]")))
Console.WriteLine(s);
}
}
}
++--
+-+-
+--+
-++-
-+-+
--++
**//
*/+-
*/-+
*/*/
*//*
/*+-
/*-+
/**/
/*/*
C:\Program Files\dotnet\dotnet.exe (process 5732) exited with code 0.
Press any key to close this window . . .
* /这两个符号,如果在一起,则形成新的填数 即对 5 5 5=5进行填写+-,根据交换律我们知道,恒成立。
当* /这两个符号分离的时候,则形成新的填数,即读 25 5 1 这几个数进行排列填写 + -,很容易知道,这个等式不可能成立。
即结果应该是 * /连在一起的所有组合,都是这个等式的解。