您的位置:首页 > 其它

计算一个数等于其它数相加的所有可能 如: 5 =1+4 ,1+3+1,2+3,2+2+1,1+1+1+1+1,1+1+1+2

2014-04-26 18:06 253 查看
初一看,这不好实现。如果是1000 还有1000个1相加。所以单纯的写for循环是不行的,当时感觉 第一循环的嵌套层数无法确认,第二 循环的结束条件是什么?

一开始想到了递归。

代码如下:

static void Main(string[] args)
{
int K = 5;

for (int i = 1; i <= K/2; i++)
{
fun(i.ToString(), i, K-i);
}
Console.ReadLine();
}

public static void fun(string str, int i, int N)
{

if (N == 0) return;
Console.WriteLine(str+"+"+N );
str += "+1";
fun(str, i, N - 1);

}


但是这样发现有重复的,比如 1+1+1+2 与 2+1+1+1



看上面的结果,发现就多了最后一条,所以只要最后一个数不要小于第一个数就可以了。

代码如下:

static void Main(string[] args)
{
int K = 5;
for (int i = 1; i <= K / 2; i++)
{
fun("", i, K - i);

}

Console.ReadLine();
}

public static void fun(string str, int first, int N)
{

if (N == 0) return;
str+= first+ "+";
Console.WriteLine(str + N);
if (first <= N - 1)  //判断后半不能与前面重。
fun(str, first, N - 1);

}


结果如下:



发现一个问题:以上代码没有实现全,像6=2+2+2 这种会丢失.

fun方法更正如下:

public static void fun(string str, int first,int N)
{

if (N == 0) return;
str += first + "+";
Console.WriteLine(str + N);

for (int i = first; i <= N - 1; i++)
{
if (i <= N - i)
fun(str, i, N - i);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: