Мне очень сложно найти простое решение этой проблемы с использованием LINQ в C#:
Для двух заданных чисел n и k найдите все возможные комбинации формы ± 1 ± 2 ± 3 ± ... ± n = k.
Например, для n = 5 и k = 3 результат будет "-1+2+3+4-5 = 3", "-1+2+3+4-5 = 3"
public static void Main()
{
int firstNNumbers = Convert.ToInt32(Console.ReadLine());
int numberOfOperations = firstNNumbers - 1;
int targetSum = Convert.ToInt32(Console.ReadLine());
char[] set = { '+', '-' };
bool hasSolution = false;
GetAllOperatorCombinations(set, numberOfOperations, targetSum, ref hasSolution);
if (hasSolution)
{
return;
}
Console.WriteLine("N/A");
}
public static int CheckIfGoodAndPrint(string prefix, int targetSum, ref bool hasSolution)
{
const int Number = 2;
int thisSum = 1;
if (prefix == null)
{
return -1;
}
for (int i = 0; i < prefix.Length; i++)
{
if (prefix[i] == '-')
{
thisSum -= i + Number;
}
else
{
thisSum += i + Number;
}
}
if (thisSum != targetSum)
{
return -1;
}
PrinEquation(prefix, targetSum);
hasSolution = true;
return 1;
}
static void GetAllOperatorCombinations(char[] set, int k, int targetSum, ref bool hasSolution)
{
int n = set.Length;
GetAllOperatorCombinations(set, "", n, k, targetSum, ref hasSolution);
}
static void GetAllOperatorCombinations(char[] set, string prefix, int n, int k, int targetSum, ref bool hasSolution)
{
if (k == 0)
{
int test = CheckIfGoodAndPrint(prefix, targetSum, ref hasSolution);
return;
}
for (int i = 0; i < n; ++i)
{
string newPrefix = prefix + set[i];
GetAllOperatorCombinations(set, newPrefix, n, k - 1, targetSum, ref hasSolution);
}
}
private static void PrinEquation(string prefix, int targetSum)
{
string equation = "";
for (int i = 1; i <= prefix.Length; i++)
{
equation += i + " " + prefix[i - 1] + " ";
if (i == prefix.Length)
{
equation += (i + 1) + " = " + targetSum;
}
}
Console.WriteLine(equation);
}
Это код, который работает во всех случаях, но я знаю, что с linq его можно сделать намного короче.