例如,我有1,2,3,4,5,6,7,8,9,并希望找到所有等于100的可能组合,并使用(加,减,串联)等运算。考虑到+运算,这样的组合之一就是[1 + 23-4 + 56 + 7 + 8 + 9 = 100]。
答案 0 :(得分:1)
首先,让我们生成所有可能的公式(您没有很多,只是3**9 == 19683
): C#此处和下方的代码
private static IEnumerable<string> Formulas() {
string[] delimiters = new string[] {
"", "", "", "", "", "", "", "", "",
};
do {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < delimiters.Length; ++i) {
sb.Append(delimiters[i]);
sb.Append(i + 1);
}
yield return sb.ToString().TrimStart('+');
for (int i = 0; i < delimiters.Length; ++i) {
if (delimiters[i] == "") {
delimiters[i] = "+";
break;
}
else if (delimiters[i] == "+") {
delimiters[i] = "-";
break;
}
delimiters[i] = "";
}
}
while (delimiters.Any(item => !string.IsNullOrEmpty(item)));
}
然后,让我们计算相应的值(借助正则表达式我们可以从公式中提取每个数字)并过滤掉所需的值:
Regex reg = new Regex(@"(?:\-|\+)?[0-9]+");
int sumUpTo = 100;
var result = Formulas()
.Distinct() // +123456789 == 123456789
.Where(formula => reg
.Matches(formula)
.OfType<Match>()
.Select(match => int.Parse(match.Value))
.Sum() == sumUpTo);
最后,让我们将result
打印出来:
Console.Write(string.Join(Environment.NewLine, result));
结果:
123-45-67+89
12-3-4+5-6+7+89
12+3+4+5-6-7+89
123+4-5+67-89
-1+2-3+4+5+6+78+9
1+2+3-4+5+6+78+9
12+3-4+5+67+8+9
1+23-4+56+7+8+9 // <- the sample answer in the question
1+2+34-5+67-8+9
1+23-4+5+6+78-9
123+45-67+8-9
123-4-5-6-7+8-9