计算一个数等于其它数相加的所有可能 如: 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循环是不行的,当时感觉 第一循环的嵌套层数无法确认,第二 循环的结束条件是什么?
一开始想到了递归。
代码如下:
但是这样发现有重复的,比如 1+1+1+2 与 2+1+1+1
看上面的结果,发现就多了最后一条,所以只要最后一个数不要小于第一个数就可以了。
代码如下:
结果如下:
发现一个问题:以上代码没有实现全,像6=2+2+2 这种会丢失.
fun方法更正如下:
一开始想到了递归。
代码如下:
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); } }
相关文章推荐
- 通用的运营商/数字在C#
- 自学unity之人物动画控制(第一篇)
- 2014年4月21日 幼儿园的生意经
- JQuery模拟七------利用extend包装ajax实现
- 浅谈 == 与 === 的性能问题
- State Management
- 如何下载Google Play上的APK文件
- Android事件机制:事件传递和消费 简短总结很不错
- Android 核心分析 之七------Service深入分析
- 三层分析法
- js 置顶
- 对象的初始化的一些问题
- 通过配置文件(web.config)实现邮件发送
- [连载]JavaScript讲义(02)--- JavaScript核心编程
- php的资料
- Samza的ApplicationMaster
- NDK编程实践之调用系统命令实现权限临时提升
- 关于memset
- RAID级别详解,如何在Linux下实现软RAID图文解析。
- WMI介绍及简单应用