泣血跪求超难算法。。。。高手有请!!!

wuoaimaomi 2008-12-13 06:55:28
我想编个彩票过滤程序:
中国福彩双色球33选6共1107568种组合,比如
1,2,3,4,5,6为第1注
1,2,3,4,5,7为第2注
.......................
1,2,3,4,5,33为第28注

1,2,3,4,6,7为第29注
1,2,3,4,6,8为第30注
.......................
1,2,3,4,6,33为第55注
........................
28,29,30,31,32,33为第1107568注

今已知某注号码中的6个号码,比如
code[1]=i code[2]=j code[3]=k code[4]=l code[5]=m code[6]=n

那么,号码code是1107568注号码中的第几注??
pos=i????j?????k????l????m?????n这个表达式怎么写???







...全文
290 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyyjaf 2010-07-23
  • 打赏
  • 举报
回复
头痛,不想了,浪费时间。。。
qgqch2008 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yxqyrh 的回复:]

这么杯具的结贴率。。。
早知道就不发了
[/Quote]杯具
yxqyrh 2010-07-23
  • 打赏
  • 举报
回复
这么杯具的结贴率。。。
早知道就不发了
yxqyrh 2010-07-23
  • 打赏
  • 举报
回复
上面的错了,是彩票数组的第一位不使用
jeremyhuang81 2010-07-23
  • 打赏
  • 举报
回复

看到这种帖子,就生气,好好一个人怎么就如此下跪了?

上跪天地,下跪父母!!!
yxqyrh 2010-07-23
  • 打赏
  • 举报
回复
数学上不知道有没有解决的办法。你可以去问问数学方面的大牛
如果没有的话,那就只能采取hash算法。
你可以建立一个彩票数组的类(大小为彩票总数+1,第一位使用),把六位号码作为它的属性
使用六重循环,把所有彩票依次放进数组中
然后再建立一个hashmap,把这个彩票数组中的彩票类作为key,彩票在数组中的索引作为value

这样做前面处理的时候有点麻烦,但是你要取100W次还是很方便的
warmworm 2010-07-23
  • 打赏
  • 举报
回复
以1为第一位的,有 C(5,32)
以2为第一位的,有 C(5,31)
所以以4为第一位的,第一注为 C(5,32)+C(5,31)+C(5,30)

再 以1,2为前两位的,有C(4,31)
以2,3为前两位的,有C(4,30)

以此类推 C(X,Y)的数量应该不是很多,可以用查表法直接得到
zhuwanglove 2010-07-23
  • 打赏
  • 举报
回复
应该可以直接用公式计算出来吧, 因为每注都是有序排列, 可以从这六个数字作为参数直接计算出它的位置。楼主33选2推演一下哦。
hgxinyu 2010-07-22
  • 打赏
  • 举报
回复
这个应该是可行的,不过速度比较慢

	vector<int> A(6);
map<vector<int>,int>pos;
int count=0;
for(int i=1;i<29;i++)
for(int j=i+1;j<30;j++)
for(int k=j+1;k<31;k++)
for(int l=k+1;l<32;l++)
for(int m=l+1;m<33;m++)
for(int n=m+1;n<34;n++){
count++;
A[0]=i;
A[1]=j;
A[2]=k;
A[3]=l;
A[4]=m;
A[5]=n;
pos[A]=count;
}
cout<<count<<endl;
pjl110 2010-07-22
  • 打赏
  • 举报
回复
能不用科学计数法写出来的都不是大数
Dlsongzhi1984 2010-07-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 wuoaimaomi 的回复:]
我想编个彩票过滤程序:
中国福彩双色球33选6共1107568种组合,比如
1,2,3,4,5,6为第1注
1,2,3,4,5,7为第2注
.......................
1,2,3,4,5,33为第28注

1,2,3,4,6,7为第29注
1,2,3,4,6,8为第30注
.......................
1,2,3,4,6,33为第55注
……
[/Quote]
按照我说的就没问题
Dlsongzhi1984 2010-07-22
  • 打赏
  • 举报
回复
很简单的,建立好33选6的数据表

Select *

From [SSBallDB].[dbo].[BaseDT]
Where 1=1
and NoText =('02 20 21 22 23 31 ') =======这就是输入你要的号码,那么就可以查到这组号码对应的ID
liangbch 2008-12-14
  • 打赏
  • 举报
回复
没什么呀,先创建这个数组,100万个元素。这些数据按照增序排列。
然后使用2分查找,复杂度为log2(100万),应该能在万分之一秒内得到结果。
wuoaimaomi 2008-12-14
  • 打赏
  • 举报
回复
各位大哥:
谢谢回复啊!!
我说的不是查询比较,而是直接通过对6个号码的计算得到这注号码在所有组合中的序号
否则这样比较的话不得了:
for k:=1 to 1000000 do
begin
code[1]:=*;code[2]:=*;code[3]:=*;code[4]:=*;code[5]:=*;code[6]:=*;
for i:=1 to 1107568 do
begin
num:=0;
for j:=1 to 6 do
if code[j]=allcode[i,j] then num:=num+1;
if num>=6 then goto out;//如果6个号码都相同,说明找到
end;
out:
pos:=i;//保存序号
end;
之所以不这样写,首先要定义一个超大数组allcode(1107568个元素),另外,我要找的可不是一两次,而是100万次,这样写的话程序立马会死掉!!,所以只能直接算出来,不能找。。。。各位还有什么高招啊,急啊!!!
lq651659889 2008-12-13
  • 打赏
  • 举报
回复
up
liangbch 2008-12-13
  • 打赏
  • 举报
回复
100种组合不多,1秒应该够了。
写一个程序,从第一个组合开始,依次递增。当最高位和目标模板的最高位吻合,则比较第2个元素,直到所有元素都相同就退出比较。
求下一个组合的代码请参见 http://topic.csdn.net/u/20081209/12/3dd2b81e-fe03-4258-8bbf-0b93c4dd860a.html

内容概要:本文系统研究了基于豪猪优化算法(CPO)的多无人机协同集群在三维空间中的避障路径规划问题,聚焦于实现以最低成本为目标的航迹优化,综合考虑路径长度、飞行高度、威胁规避及转弯角度等多个关键因素。通过构建精细化的三维环境模型与多无人机协同机制,采用Matlab平台实现CPO算法的仿真与验证,充分展示了该算法在复杂动态障碍环境下的高效搜索能力与全局优化性能。研究不仅涵盖了路径规划的数学建模与目标函数设计,还深入探讨了算法的收敛特性与鲁棒性,为智能群体系统在实际场景中的应用提供了理论依据与技术支撑。; 适合人群:具备一定编程基础和优化算法背景,从事无人机系统控制、智能路径规划、群体协同、人工智能与自动化等相关领域的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于多无人机协同执行侦察、灾害监测、应急救援、区域巡检等复杂任务中的自主路径规划;②为智能优化算法在三维动态环境下的路径决策问题提供可复现的技术范例;③支持研究人员对CPO算法与其他主流群智能算法(如PSO、GWO、WOA等)进行性能对比与改进研究,推动路径规划技术的发展。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点理解目标函数的多维度建模方式与CPO算法的迭代优化流程,可通过调整环境参数与约束条件进行仿真实验,对比不同算法在相同场景下的路径质量与收敛速度,从而深入掌握其优势与适用边界。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧