首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在c#中生成将数字写为不同数字之和的所有可能性

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

Stack Overflow用户
提问于 2016-03-15 05:41:36
回答 1查看 277关注 0票数 0

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

就我所做的工作而言,我只能得到(在这个例子中)(1,7)(1,(2,5)(3,4))(2,6)(3,5),和组合,因为给定的数字更高,所以组合更加重叠。我怎么才能得到正确的结果而不是我的呢?该函数为:

代码语言:javascript
复制
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)。提前感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-15 06:33:06

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

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
(7, 1)
(6, 2)
(5, 3)
(5, 2, 1)
(4, 3, 1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35998633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档