初一看,这不好实现。如果是1000 还有1000个1相加。所以单纯的写for循环是不行的,当时感觉 第一循环的嵌套层数无法确认,第二 循环的结束条件是什么?
一开始想到了递归。
代码如下:
1 static void Main(string[] args) 2 { 3 int K = 5; 4 5 for (int i = 1; i <= K/2; i++) 6 { 7 fun(i.ToString(), i, K-i); 8 } 9 Console.ReadLine(); 10 } 11 12 public static void fun(string str, int i, int N) 13 { 14 15 if (N == 0) return; 16 Console.WriteLine(str+"+"+N ); 17 str += "+1"; 18 fun(str, i, N - 1); 19 20 }
但是这样发现有重复的,比如 1+1+1+2 与 2+1+1+1
看上面的结果,发现就多了最后一条,所以只要最后一个数不要小于第一个数就可以了。
代码如下:
1 static void Main(string[] args) 2 { 3 int K = 5; 4 for (int i = 1; i <= K / 2; i++) 5 { 6 fun(i + "+", i, K - i); 7 8 } 9 10 Console.ReadLine(); 11 } 12 13 public static void fun(string str, int first, int N) 14 { 15 16 if (N == 0) return; 17 Console.WriteLine(str + N); 18 str += 1 + "+"; 19 if (first <= N - 1) //判断后半不能与前面重。 20 fun(str, first, N - 1); 21 22 }
结果如下:
计算一个数等于其它数相加的所有可能 如: 5 =1+4 ,1+3+1,2+3,2+2+1,1+1+1+1+1,1+1+1+2,布布扣,bubuko.com
计算一个数等于其它数相加的所有可能 如: 5 =1+4 ,1+3+1,2+3,2+2+1,1+1+1+1+1,1+1+1+2
原文:http://www.cnblogs.com/startlearn/p/3691853.html