首先,让我们生成所有可能的公式(你没有很多,只有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