• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
gw2010
重新编程
博客园    首页    新随笔    联系   管理    订阅  订阅
代码段,数字拆分用

烂代码一段,备用,不是备看,万一哪天要用一下呢。

功能:把数字拆分,尽量在40以内,后面会很慢。如3可分成 1,1,1;1,2; 如4可分成 1,1,1,1;1,3;1,1,2;2,2;

        static void Main(string[] args)
        {
            var x = SplitNumber(40);
            foreach (var a in x)
            {
                foreach (var i in a)
                {
                    Console.Write("{0}\t", i);
                }
                Console.WriteLine();
            }

            Console.Read();
        }

        private static List<List<int>> SplitNumber(int num)
        {
            if (num <= 0) return null;

            List<List<int>> ret = new List<List<int>>();
            List<int> a = new List<int>();
            a.Add(1);
            ret.Add(a);

            int ct = num - 1;
            while (ct > 0)
            {

                int rct = ret.Count;
                for (int i = 0; i < rct; i++)
                {
                    var tp = ret[0];
                    ret.Remove(ret[0]);

                    var cp = new List<int>(tp.ToArray());
                    cp.Add(1);
                    if (!Exists(ret, cp))
                        ret.Add(cp);

                    List<int> used = new List<int>();
                    for (int j = 0; j < tp.Count; j++)
                    {
                        var cpv = new List<int>(tp.ToArray());
                        cpv[j] = cpv[j] + 1;

                        if (!Exists(ret, cpv))
                            ret.Add(cpv);
                    }
                }

                ct--;
            }

            return ret;
        }

        private static bool Exists(List<List<int>> a, List<int> b)
        {
            foreach (var x in a)
            {
                if (x.Count == b.Count)
                {
                    bool flag = false;
                    foreach (var i in x)
                    {
                        if (!b.Contains(i))
                        {
                            flag = true;
                            break;
                        }

                    }
                    if (!flag)
                        return true;
                }
            }
            return false;
        }

 

声明本博客文章未特殊注明均为原创,转载请注明作者和原地址。 博客地址:http://www.cnblogs.com/gw2010/ 博客首发:http://www.zhou2019.cn
posted on 2015-10-15 16:01  gw2010  阅读(446)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3