由和与加数进行凑数的遍历算法
最近老婆工作上需要用到根据一堆数据,再根据一个已知的和,找到这个和由哪几个数凑得。
看着老婆花时间慢慢随机选数算,这太低效了。网上搜了下,的确有一个execl的凑数插件,工具有使用次数限制。100次就需要花80大洋买。看着也不是多复杂的东西,C#稍微了解一点点,既然找不到免费的,干脆自己写个桌面版的吧(谁让github没搜到呢o(╥﹏╥)o)。
已经附上工具下载链接,源码github链接在文章末尾,需要的自取改代码,不想看实现说明的直接拖到最后。
自己对于C#的winform用的很少,只是写工具会用到一点,实现上其实就是遍历。.
例如1,2,11,3,5,41,22,31,54这9个数据,需要凑和为33的数,
(1)首先进行排序, 排完后为1,2,3,5,11,22,31,41,54
(2)进行遍历,遍历根据组合的个数来,首先假设是1个数就能得到33,那一共9个组合,假设和由两个加数构成,那组合就是1,2 /1,3/1,5/...1,54/2,3/2,5/...31,54/41,54 ,数据放到一个listsrc中,依次遍历数据。
(3)每次遍历时,最前面的数据是慢慢移位的例如1,2遍历过了,那2,1是不需要再遍历了。如何实现自己这块还是花了点时间想了下,自己的实现是新建一个list listindex,list的个数代表组合的加数个数。例如先假定2个数,那么listindex的个数是2,listindex[0]代表第一个加数在源数据的位置, 比如list[0] 是3,那么 listsrc[list[0]] = 11。 每次遍历时,listindex[最后一位]+1,如果加到了listsrc的尾数,那么listindex的倒数第二位+1,重置最后一位的值。 每次+1可以类比两个数加法的实现,会产生进位,进位后,不过不是固定的10进制加法,高位进位后,地位需要重新根据高位位置重设定一下低位的值。一直遍历,直到在这个加数个数的值以及遍历完,加数的个数再+1,再继续遍历。
public bool ToaddIndex(ref List<int> SrcDataindex, ref List<double> srcData){int c = 0;int lastestIndex = SrcDataindex.Count - 1; //最后一位的数的indexSrcDataindex[lastestIndex]++;for (int i = lastestIndex; i >= 0; i--){if (c > 0) //产生了进位{SrcDataindex[i] += c; //高位进行+1for (int j = i; j + 1 <= lastestIndex; j ++){// 低位根据高位的值重新设定SrcDataindex[j+1] = SrcDataindex[j] + 1; }}// 判断是否最前面的数大于允许偏移的位置if(SrcDataindex[0] > srcData.Count - (lastestIndex) + 1){SrcDataindex[0] -= c;Console.WriteLine("is 1 false");return false;}if (SrcDataindex[i] > srcData.Count - (SrcDataindex.Count - i)) //该位偏移到了允许最大位{c = 1; //产生进位}else{return true; // 当前数目的加数没有遍历完}}return false;}
实际上因为数据进行了排序,所以如果假设加数有3个数,如果和已经大于了我们想要的数,例如已经遍历到了5,11,22 那么剩下的5,11,31组合就不需要遍历了,因为肯定大于33的,所以直接跳到5,22,31 这样可以节省很多的组合数据,随着数据的变多,节省的时间也是很可观的。
源码 github地址 https://github.com/GoGoTryAgain/AutoGetSum
因为是基于.net4.0写的,运行需要电脑带有.netFramework 4.0。
为了防止结果过多卡主,目前限定组合为50个,需要更大的童鞋可以拿源码自己改。
最初还设想,有一堆的数,有多个和待凑数,每个数只会用一次,找到合适的组合的,最后因为老婆说用不到,自己偷懒就没写,界面上还保存着,也许哪天会更新呢~
由和与加数进行凑数的遍历算法相关推荐
- python二叉树遍历算法_分享python实现的二叉树定义与遍历
这篇文章主要介绍了python实现的二叉树定义与遍历算法,结合具体实例形式分析了基于Python定义的二叉树及其常用遍历操作实现技巧,需要的朋友可以参考下 本文实例讲述了python实现的二叉树定义与 ...
- 【swjtu】数据结构实验6_二叉树的遍历算法
实验内容及要求: 编写程序,用先序递归遍历法建立二叉树的二叉链表存储结构,然后输出其先序.中序.后序以及层次遍历结点访问次序.其中层次遍历的实现需使用循环队列.二叉树结点数据类型建议选用字符类型. 实 ...
- 重拾算法(3)——用458329个测试用例全面测试二叉树和线索二叉树的遍历算法
重拾算法(3)--用458329个测试用例全面测试二叉树和线索二叉树的遍历算法 在"上一篇"和"上上一篇"中,我给出了二叉树和线索二叉树的遍历算法.给出算法容易 ...
- C#二叉树遍历算法实现浅析
C#算法实现了二叉树的定义,怎么构造一颗已知的二叉树,用几种常规的算法(先序,中序,后序,层次)进行C#二叉树遍历.希望能给有需要人带来帮助,也希望能得到大家的指点.有关C#数据结构的书在书店里找到, ...
- [zhuan]二叉树遍历算法实现(C#2.0)
本人用C#2.0实现了二叉树的定义,怎么构造一颗已知的二叉树,用几种常规的算法(先序,中序,后序,层次)遍历二叉树.希望能给有需要人带来帮助,也希望能得到大家的指点.有关C#数据结构的书在书店里找到, ...
- 图的两种遍历算法——BFS和DFS
一.BFS,也称广度优先搜索,和二叉树的层次遍历算法类似 //BFS bool visited[MaxVertexNum]; void BFSTraverse(Graph G){for(i=0;i&l ...
- C++ STL 常用遍历算法
C++ STL 常用遍历算法 STL的容器算法迭代器的设计理念 1) STL的容器通过类模板技术,实现数据类型和容器模型的分离 2) STL的迭代器技术实现了遍历容器的统一方法:也为STL的算法提供 ...
- 九十五、二叉树的递归和非递归的遍历算法模板
@Author:Runsen 刷Leetcode,需要知道一定的算法模板,本次先总结下二叉树的递归和非递归的遍历算法模板. 二叉树的四种遍历方式,前中后加上层序遍历.对于二叉树的前中后层序遍历,每种遍 ...
- 二叉树的层序遍历算法 + 打印二叉树所有最左边的元素(算法)
二叉树的层序遍历算法 + 打印二叉树所有最左边的元素(算法) 层序遍历 /** * 树结构定义 */ private static class BinaryNode<T> {BinaryN ...
最新文章
- 【工业智能】人工智能真的无所不能吗?
- poj 1085 Triangle War 博弈论+记忆化搜索
- Openstack_通用模块_Oslo_vmware 创建 vCenter 虚拟机快照
- oracle数据库是db还是dbnms,Oracle数据库中各种类型的文件损坏与修复过程详解(2)...
- 华夫饼为什么不松软_掌握这2个关键点,5个小细节,3个小技巧,保证烙饼松软又好吃...
- postgres 支持的线程数_线程池被打满了怎么处理呢,你是否真的了解线程池?
- 利用Mac创建一个 IPv6 WIFI 热点
- Altium Designer之原理图
- python导入xlrd库_python中xlrd库如何实现文件读取?
- 计算机英语翻译3000字,英语专四作文满分范文(二十八):计算机翻译
- 网站搜索引擎优化SEO策略及相关工具资源
- java培训 lambda表达式_java 8 中lambda表达式学习
- GNU __attribute__ 总结
- tomcat下的公共jar包配置
- King Arthur's Birthday Celebration
- java关键字const_java 关键字详解
- sdk 今日头条_今日头条大数据分析平台艰辛成长路
- CentOS7图形界面启动报错unable to connect to X server
- iOS添加pch头文件
- (转)逃脱者可获生机(中)
热门文章
- 服务器电脑上保存的文件找不到了,保存在电脑上的word文件突然找不到怎么办?该如何找回来...
- 数字藏品|NFT整个行业的调研报告 数字藏品有价值吗 数字藏品是什么 百度数字藏品
- 微信小程序利用canvas绘制一个静态百分比圆圈
- python 卡方分布值_python数据分析探索变量之间的关系
- 凸显计算机学院特色的剧本,高职院校非计算机专业计算机课程的教学改进策略探析 - 计算机教育论文大全 - 小品台词 - 中国国际剧本网...
- PoisonIvy Rat 远程溢出实战
- 基于springboot校园志愿者管理系统设计与实现的源码+文档
- 第9章第24节:制作商业计划书的盈利模式幻灯片 [PowerPoint精美幻灯片实战教程]
- [渝粤教育] 中国矿业大学 货币金融学 参考 资料
- mysql 索引案例与索引策略