加上数字之间以便做出真实的陈述

时间:2017-12-09 16:36:51

标签: c# math

我需要在大数字的数字之间加上加号(+),并移动所有选项,以获得真正的表达式或真实的语句:(C#)

  

实施例
  如果我有---> 130 = 1612345

  我需要它---> 130 = 1 + 61 + 23 + 45

我用数组,fors等尝试过它。

[我不关心效率]

2 个答案:

答案 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循环变量的位位置)。然后你可以检查当前组合是否给出了有效的总和。