如何在c#中生成将数字写为不同数字之和的所有可能性

时间:2016-03-14 21:41:36

标签: c# .net

我正在尝试制作递归算法,该算法返回将给定数字写为不同数字之和的所有可能性。 例如,如果给定的数字是(1,7)(1,2,5)(1,3,4)(2,6)(3,5),我的程序应该返回(1,7)(1,(2,5)(3,4))(2,6)(3,5),

就我工作而言,我能得到的是(对于这个例子)public String calculate(float number, float i) { String str = ""; float half = number / 2; while ( i < half) { float diff = number - i; str = str + "(" + i + "," + diff + ")"; if (calculate(diff, i + 1) != "") str = str + "(" + i + "," + calculate(diff, i + 1) + ")"; i++; } return str; } 并且随着给定数字的增加,组合甚至更加复杂。我怎样才能得到正确的结果而不是我的? 功能是:

calculate(number,1)

该函数的调用是var path = require('path'); var express = require('express'); var app = express(); var router = express.Router(); router.use(express.static(path.join(__dirname, '/scripts'))); router.get('*', function(request, response) { response.sendFile(path.join(__dirname, 'views/index.html')); }); app.use(router); app.listen(80); 。提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这是我在SO上基于Java answer的示例程序。我根据您的要求将其修改为仅显示具有不同值的总和。您可以修改它以返回连接的字符串,而不是仅仅输出总和。

class Program
{
    static void Main(string[] args)
    {
        DisplayDistinctSums(8f);
    }

    static void DisplayDistinctSums(float baseNum)
    {
        DisplayDistinctSums(baseNum, baseNum - 1, "(");
    }

    static void DisplayDistinctSums(float baseNum, float nextNum, string sumString)
    {
        if (baseNum < 1)
        {
            sumString += ")";
            Console.WriteLine(sumString);
            return;
        }

        for (var i = Math.Min(nextNum, baseNum); i >= 1; i--)
        {
            if (!sumString.Contains(i.ToString()))
            {
                DisplayDistinctSums(baseNum - i, i, 
                    sumString.Length == 1 ? sumString + i : sumString + ", " + i);
            }
        }
    }
}

输入: 8

<强>输出:

(7, 1)
(6, 2)
(5, 3)
(5, 2, 1)
(4, 3, 1)