我需要在大数字的数字之间加上加号(+),并移动所有选项,以获得真正的表达式或真实的语句:(C#)
实施例
如果我有---> 130 = 1612345
我需要它---> 130 = 1 + 61 + 23 + 45
我用数组,fors等尝试过它。
[我不关心效率]
答案 0 :(得分:1)
这是一个实现Jeroen Boschma描述的实现:
class Program
{
static void Main(string[] args)
{
string input = "130=1612345";
string[] inputs = input.Split("=".ToCharArray());
if (inputs.Length == 2)
{
string strSum = inputs[0].Trim();
string strDigits = inputs[1].Trim();
int sum, values;
if (int.TryParse(strSum, out sum) && int.TryParse(strDigits, out values))
{
Console.WriteLine("Input: " + input);
List<string> solutions = FindEquation(sum, values);
Console.WriteLine("Solutions Found: " + solutions.Count.ToString());
for(int i = 0; i < solutions.Count; i++)
{
Console.WriteLine("Solution #" + (i + 1).ToString() + ": " + solutions[i]);
}
}
}
Console.WriteLine("");
Console.Write("Press [Enter] to exit...");
Console.ReadLine();
}
private static List<string> FindEquation(int sum, int values)
{
List<string> solutions = new List<string>();
string binary;
string[] addends;
int iterationSum;
StringBuilder iteration = new StringBuilder();
char[] digits = values.ToString().ToCharArray();
int possibilities = (int)Math.Pow((double)2, (double)(digits.Length - 1));
for(int i=0; i < possibilities; i++)
{
binary = Convert.ToString(i, 2).PadLeft(digits.Length - 1, '0');
iteration.Clear();
for(int j=0;j<digits.Length; j++)
{
iteration.Append(digits[j]);
if((j < (digits.Length -1)) && (binary.Substring(j, 1) == "1"))
{
iteration.Append("+");
}
}
addends = iteration.ToString().Split("+".ToCharArray());
iterationSum = 0;
foreach(string addend in addends)
{
iterationSum = iterationSum + int.Parse(addend);
}
if (iterationSum == sum)
{
solutions.Add(sum.ToString() + "=" + iteration.ToString());
}
}
return solutions;
}
}
输出:
Input: 130=1612345
Solutions Found: 1
Solution #1: 130=1+61+23+45
Press [Enter] to exit...
答案 1 :(得分:0)
这不是一个与C#相关的问题,而是您正在寻找一种算法。在您的示例中,&#39; 1612345&#39;包含7个数字,这意味着在中间有6个可能存在+的地方。因此,对于N个数字,N-1个可能的加号,并且计算它们所有你有2 ^(N-1)种可能性。
因此,制作一个从0(无加号)到2 ^(N-1)-1(所有加号都存在)的for循环。对于每个加号来测试它是否存在,你对for循环变量进行一次位测试(每个加号对应于for循环变量的位位置)。然后你可以检查当前组合是否给出了有效的总和。