|
易语言里写彩票工具的易语言彩人不少,但真正把直选和组选转换逻辑吃透的票算没几个。我见过一个源码,法直作者用三层嵌套循环硬算组选,选转选结果跑1000注号码要等三秒多。换组其实直选转组选的易语言彩核心就一句话:把有序数字变成无序组合,再按规则去重。票算 直选号码是法直带位置的。比如排列三的选转选直选123,百位1、换组十位2、易语言彩个位3,票算顺序固定。法直组选呢?选转选组六不分顺序,123、换组132、213、231、312、321都算同一注。组三更特殊,两个相同数字加一个不同数字,比如112,它的直选形态有112、121、211三种。豹子号如111,直选和组选完全一致,只有一注。 转换时最容易踩的坑是组三的重复计数。有人写代码把直选号码排序后直接当组选,结果112排序后还是112,但121排序后变成112,211也变成112。三注直选对应同一注组选,如果不去重,组选注数就虚高了。正确的做法是:先把直选号码的各位数字取出来,按从小到大排序,生成一个字符串键值,再用哈希表或数组去重。易语言里可以用“节点”或者“文本数组”来实现。 具体代码思路是这样的。假设直选号码存在一个文本数组里,每个元素是三位字符串。循环取出每个号码,用“取文本中间”分别拿到百十个位,转成整数后比较大小,手动排序。排序后的三位数字拼成新字符串,比如“123”。然后检查这个字符串是否已经存在于结果数组中,不存在就加入。这样跑下来,组六的直选转组选是6合1,组三是3合1,豹子是1合1。 有个细节要注意:彩票号码允许前导零。直选012,取位后是0、1、2,排序后还是012。如果用数值型变量存储,0会被丢掉,变成12,那就错了。所以全程用文本处理,别偷懒转整数。我见过一个开源项目就因为这个问题,导致所有含0的号码转换后少了一位,用户反馈后作者查了两天才找到。 性能方面,直选全组合是1000注,转组选后组六120注、组三90注、豹子10注,总共220注。用易语言的数组去重,1000次循环加上文本比较,现代CPU上毫秒级完成。如果嫌慢,可以预先建一个220个元素的哈希表,键是排序后的字符串,值是组选号码,直接查表替换。但没必要,这点计算量连易语言的解释器都扛得住。 实际写的时候,建议把转换封装成子程序,输入直选文本数组,输出组选文本数组。内部用两个循环:外层遍历直选,内层做排序和去重。排序可以用冒泡,三个数字最多比较三次,写死就行。去重用“文本数组”的“是否存在”命令,易语言自带,比自己写循环快。 最后说个观察:很多人把直选转组选和组选转直选搞混。组选转直选是展开,组六展开成6注,组三展开成3注,豹子还是1注。方向反了,逻辑完全不同。直选转组选是收敛,去重是关键;组选转直选是发散,排列是关键。写代码前先想清楚方向,能省不少调试时间。 |