user-0 提问: 历遍双色球所有可能性 怎么去除重复的号码？

回复:
user: user-0
content: 感谢各位的回复  经提醒只要在相套内加入条件即可，谢谢各位了。

user: user-1
content: 仅供参考：//要求1:从给出来的不同的六组数字中，从每组任意挑选一个数字，最后组成一个六个数字的数组。 //将所有的数组全部列出来。 //同时，排除全部为偶数、全部为奇数的数组。 //排除四个数字递增连续（比如8、9、10、11）的数组。 //如下： //第一个数字从这12个数字中挑选：,1,3,2,4,5,6,7,8,9,10,11,12 //第二个数字从这17个数字中挑选：,8,7,5,9,6,4,11,10,12,13,3,14,17,2,16,15,18 //第三个数字从这21个数字中挑选：,13,10,15,16,18,11,14,12,7,19,21,17,8,22,9,20,6,23,5,24,25 //第四个数字从这20个数字中挑选：,22,23,18,20,16,17,15,21,14,26,19,24,27,25,12,13,11,10,28,29 //第五个数字从这19个数字中挑选：,26,25,27,29,30,28,23,24,20,22,19,31,21,17,18,32,13,15,16 //第六个数字从这14个数字中挑选：,32,33,30,31,29,28,27,26,25,24,23,22,18,21 //要求2: //请输入第1个数字的选择范围：（可以手动输入任意几个空格间隔的数字,最多30个） //请输入第2个数字的选择范围：（可以手动输入任意几个空格间隔的数字,最多30个） //请输入第3个数字的选择范围：（可以手动输入任意几个空格间隔的数字,最多30个） //请输入第4个数字的选择范围：（可以手动输入任意几个空格间隔的数字,最多30个） //请输入第5个数字的选择范围：（可以手动输入任意几个空格间隔的数字,最多30个） //请输入第6个数字的选择范围：（可以手动输入任意几个空格间隔的数字,最多30个） //然后回车，输出结果到cp.txt //要求3: //保证同一组数据的数都不相同。 //比如，第一个数为6时，第二个数或其他的数都不能再为6；第二个数为10时，第三个数或其他的数都不能再为10，以此类推…… //要求4: //增加一个条件：在产生的每个数组A1A2A3A4A5A6中，要求A1<A2<A3<A4<A5<A6 #include <stdio.h> #include <stdlib.h> #include <string.h> int v[6]; int n[6]={12,17,21,20,19,14}; int d[6][30]={       {1,3,2,4,5,6,7,8,9,10,11,12},       {8,7,5,9,6,4,11,10,12,13,3,14,17,2,16,15,18},       {13,10,15,16,18,11,14,12,7,19,21,17,8,22,9,20,6,23,5,24,25},       {22,23,18,20,16,17,15,21,14,26,19,24,27,25,12,13,11,10,28,29},       {26,25,27,29,30,28,23,24,20,22,19,31,21,17,18,32,13,15,16},       {32,33,30,31,29,28,27,26,25,24,23,22,18,21}, }; int i,j,i0,i1,i2,i3,i4,i5,s; char ln[100],*t; FILE *f; int main() {     for (i=0;i<6;i++) {         printf("请输入第%d个数字的选择范围：",i+1);         fgets(ln,100,stdin);         j=0;         t=strtok(ln," ");         while (1) {             if (NULL==t) break;             if (0==t[0]) continue;//跳过多个空格间隔时取出的空串             d[i][j]=atoi(t);             j++;             if (j>=30) break;             t=strtok(NULL," ");         }         n[i]=j;     }     f=fopen("cp.txt","w");     if (NULL==f) {         printf("无法生成cp.txt!\n");         return 1;     }     printf("正在生成cp.txt...");     for (i0=0;i0<n[0];i0++) {     for (i1=0;i1<n[1];i1++) {     for (i2=0;i2<n[2];i2++) {     for (i3=0;i3<n[3];i3++) {     for (i4=0;i4<n[4];i4++) {     for (i5=0;i5<n[5];i5++) {         v[0]=d[0][i0];         v[1]=d[1][i1];         v[2]=d[2][i2];         v[3]=d[3][i3];         v[4]=d[4][i4];         v[5]=d[5][i5];         if (0==(v[0]%2)          && 0==(v[1]%2)          && 0==(v[2]%2)          && 0==(v[3]%2)          && 0==(v[4]%2)          && 0==(v[5]%2)) continue;//排除全部为偶数         if (1==(v[0]%2)          && 1==(v[1]%2)          && 1==(v[2]%2)          && 1==(v[3]%2)          && 1==(v[4]%2)          && 1==(v[5]%2)) continue;//排除全部为奇数         for (i=0;i<5;i++) {             for (j=i+1;j<6;j++) {                 if (v[i]==v[j]) goto NEXT;//保证同一组数据的数都不相同             }         }     NEXT:         if (i>=5) {             for (i=0;i<5;i++) for (j=i+1;j<6;j++) if (v[i]>v[j]) {s=v[i];v[i]=v[j];v[j]=s;}//从小到大排序             if ((v[0]+1==v[1]               && v[1]+1==v[2]               && v[2]+1==v[3])              || (v[1]+1==v[2]               && v[2]+1==v[3]               && v[3]+1==v[4])              || (v[2]+1==v[3]               && v[3]+1==v[4]               && v[4]+1==v[5])) continue;//排除四个数字递增连续             fprintf(f,"%2d,%2d,%2d,%2d,%2d,%2d\n",v[0],v[1],v[2],v[3],v[4],v[5]);         }     }}}}}}     fclose(f);     printf("\n生成cp.txt完毕\n");     return 0; } //如果文件in.txt的内容为 //1 3 2 4 5 6 7 8 9 10 11 12 //8 7 5 9 6 4 11 10 12 13 3 14 17 2 16 15 18 //13 10 15 16 18 11 14 12 7 19 21 17 8 22 9 20 6 23 5 24 25 //22 23 18 20 16 17 15 21 14 26 19 24 27 25 12 13 11 10 28 29 //26 25 27 29 30 28 23 24 20 22 19 31 21 17 18 32 13 15 16 //32 33 30 31 29 28 27 26 25 24 23 22 18 21 //可以在cmd窗口里面输入命令 //cp <in.txt //得到要求1对应的结果 //BTW:中了一定要分我六成啊！嘿嘿！(^=^)

user: user-2
content: 引用 11 楼 yajuie 的回复:[quote=引用 9 楼 aboluo67的回复:][quote=引用 6 楼 yajuie 的回复:] [quote=引用 4 楼 yajuie的回复:]6层循环嵌套， int a,b,c; for(a=1;a<34-2;a++)    for(b=a+1;b<34-1;b++)       for(c=b+1;c<34;c++)            .........   类似这样，可以遍历双色球，全部组合， 本人也对这方面感兴趣，可交流一下私底下的算法 如果，有交流意向，可留联系方式[/quote]  谢谢  留个联系方式吧，我加你。[/quote] 企鹅，1121191809不知道这个论坛，可不可以这样写[/quote] for(shifty[0]=1;shifty[0]<N-5;shifty[0]++) 		for(shifty[1]=shifty[0]+1;shifty[1]<N-4;shifty[1]++) 			for(shifty[2]=shifty[1]+1;shifty[2]<N-3;shifty[2]++) 					for(shifty[3]=shifty[2]+1;shifty[3]<N-2;shifty[3]++) 						for(shifty[4]=shifty[3]+1;shifty[4]<N-1;shifty[4]++) 							for(shifty[5]=shifty[4]+1;shifty[5]<N-0;shifty[5]++)  //这是我写的双色球红球 部分，用来遍厉双色球的，不过这种写法，是把双色球从小到大排列，才形成的

user: user-2
content: 引用 9 楼 aboluo67的回复:[quote=引用 6 楼 yajuie 的回复:] [quote=引用 4 楼 yajuie的回复:]6层循环嵌套， int a,b,c; for(a=1;a<34-2;a++)    for(b=a+1;b<34-1;b++)       for(c=b+1;c<34;c++)            .........   类似这样，可以遍历双色球，全部组合， 本人也对这方面感兴趣，可交流一下私底下的算法 如果，有交流意向，可留联系方式[/quote]  谢谢  留个联系方式吧，我加你。[/quote] 企鹅，1121191809不知道这个论坛，可不可以这样写

user: user-0
content: 引用 8 楼 chen_chen__ 的回复:你把出现过的号保存在建的表中，没循环一次就比较，重复的号自动过滤掉   谢谢回复  ， 我也想过先全部历遍再筛选，但我运行到不到1／10的时候结果已经快上兆了，没办法取出导入数据库。

user: user-0
content: 引用 6 楼 yajuie 的回复:[quote=引用 4 楼 yajuie的回复:]6层循环嵌套， int a,b,c; for(a=1;a<34-2;a++)    for(b=a+1;b<34-1;b++)       for(c=b+1;c<34;c++)            .........   类似这样，可以遍历双色球，全部组合， 本人也对这方面感兴趣，可交流一下私底下的算法 如果，有交流意向，可留联系方式[/quote]  谢谢  留个联系方式吧，我加你。

user: user-3
content: 你把出现过的号保存在建的表中，没循环一次就比较，重复的号自动过滤掉

user: user-4
content: 用表记录已经分配的号码即可

user: user-2
content: 引用 4 楼 yajuie的回复:6层循环嵌套， int a,b,c; for(a=1;a<34-2;a++)    for(b=a+1;b<34-1;b++)       for(c=b+1;c<34;c++)            .........   类似这样，可以遍历双色球，全部组合， 本人也对这方面感兴趣，可交流一下私底下的算法 如果，有交流意向，可留联系方式

user: user-2
content: 引用 4 楼 yajuie的回复:6层循环嵌套， int a,b,c; for(a=1;a<34-2;a++)    for(b=a+1;b<34-1;b++)       for(c=b+1;c<34;c++)            .........   类似这样，可以遍历双色球，全部组合， 本人也对这方面感兴趣，可交流一下私底下的算法 6层循环嵌套，<br /> int a,b,c;<br /> for(a=1;a<34-2;a++)<br />    for(b=a+1;b<34-1;b++)<br />       for(c=b+1;c<34;c++)<br />            .........<br /> <br /> <br /> 类似这样，可以遍历双色球，全部组合，<br /> 本人也对这方面感兴趣，可交流一下私底下的算法 ，声明下是双色球选号方面的算法

user: user-2
content: 6层循环嵌套， int a,b,c; for(a=1;a<34-2;a++)    for(b=a+1;b<34-1;b++)       for(c=b+1;c<34;c++)            .........   类似这样，可以遍历双色球，全部组合， 本人也对这方面感兴趣，可交流一下私底下的算法

user: user-5
content: 把你的条件加在h++;的前面。

user: user-0
content: 引用 1 楼 user-6 的回复:看了下游戏规则"双色球每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1--33中选择；蓝色球号码从1到16中选择。每注需要选择6个红色球号码，1个蓝色球号码。"  A.假设红色只有1~32， 那么红色只需要5位，红色球共需要30位的整数, 足够32位整数。但是加上蓝色就不行了. 1. 使用64位整数 2. 双循环.    B. 加上没有处理的33 其他就只有1~32, 同A处理, 只需要5*5+4 = 29位,32位足够.   对于这种问题, 将N循环压缩成一次循环不仅能提高效率, 还能减少错误概率. 谢谢 回答 ，效率什么的并不是最关心的，毕竟之后一千七百多万的可能性，我现在碰到的问题的是单纯用循环的话会出现不同位置的红球会出现同号的现象，这个怎么解决呢，能写点代码给我看看么 谢谢。

user: user-6
content: 看了下游戏规则"双色球每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1--33中选择；蓝色球号码从1到16中选择。每注需要选择6个红色球号码，1个蓝色球号码。"  A.假设红色只有1~32， 那么红色只需要5位，红色球共需要30位的整数, 足够32位整数。但是加上蓝色就不行了. 1. 使用64位整数 2. 双循环.    B. 加上没有处理的33 其他就只有1~32, 同A处理, 只需要5*5+4 = 29位,32位足够.   对于这种问题, 将N循环压缩成一次循环不仅能提高效率, 还能减少错误概率.