原帖及讨论:http://bbs.bccn.net/thread-120387-1-1.html 我刚开始写双色球机选程序都是像下面这样写 #include<math.h> #include<stdlib.h> #include<time.h> main() { int i ,j ,k; int num[6]; srand((unsigned)time(NULL)); for(i = 0;i < 6;i++) { num[i] = random(33)+1; for(j = 0;j < i;j++) { if(num[i] == num[j]) { i--; j = 7; } } } num[5] = random(16)+1; for(i = 0;i < 6;i++) printf("%2d ",num[i]); printf("+%2d ",num[5]); getch(); } 这种写法的好处是好想 但是要承认的是这种写法效率很低(而且这个程序还是没有加号码大小的排序) 要只输出少量号码组的时候可能并没有表现出它的低效问题 但是在产生并输出大量这些号码的时候就会表现出其低效性 为此我想到了一个更好的方法: #include<math.h> #include<stdlib.h> #include<time.h> main() { int i ,j ,k; int num[6]; srand((unsigned)time(NULL)); num[0] = random(28)+1; for(i = 1;i < 6;i++) { num[i] = num[i-1]+random(28-num[i-1]+i)+1; } num[5] = random(16)+1; for(i = 0;i < 6;i++) printf("%2d ",num[i]); printf("%2d ",num[i]); getch(); } 大家可以很快的看出这个程序要优于上一个程序 虽然这样效率会很高 但是对于做彩票软件的人来说会遇到一个问题 就是在对大量彩票号码组进行比较是否重复的比较 和 号码的定位 的时候却会很麻烦 所以我就想到一个通过对号码标号计数的方法来自选 #include<math.h> #include<stdlib.h> #include<time.h> #include<graphics.h> int Init(); int MakeForm(); int *(OutNum)(); unsigned long C(int a ,int b); unsigned long A(int a ,int b); unsigned long Form[29][6]; unsigned long Max; int main() { Init(); MakeForm(); while(getch() != 27) OutNum(); } int Init() /* 显示模式和随机函数初始化 用图形模式是为了能在一个屏幕中显示更多的信息 */ { int gd = DETECT,gm = 0; initgraph(&gd ,&gm ,""); /* 图形模式初始化 */ srand((unsigned)time(NULL)); /* 随机函数时间点初始化 */ Max = C(6 ,33); } int MakeForm() /* 制定号码查询表 在真正的应用中就可不用做输出了 */ { int i ,j; for(i = 1;i <= 28;i++) { Form[i][0] = C(5,33-i); printf("%3d-->%-2ld/t",i ,Form[i][0]); Form[i][1] = C(4,32-i); printf("%3d-->%-2ld/t",i+1 ,Form[i][1]); Form[i][2] = C(3,31-i); printf("%3d-->%-2ld/t",i+2 ,Form[i][2]); Form[i][3] = C(2,30-i); printf("%3d-->%-2ld/t",i+3 ,Form[i][3]); Form[i][4] = 29-i; printf("%3d-->%-2ld/n",i+4 ,Form[i][4]); Form[i][5] = 1; } } int *(OutNum)() /* 机选双色球号码 n为号码组的标号 */ { int i ,j; unsigned long n ,r=1; int num[6]; n = ((unsigned long)rand()*rand())%Max; printf("%ld/n",n); for(i = 0 ,j = 0;j < 6;j++) for(r = 1;i <= 28+j && r; ) { if(n < Form[i][j]) { num[j] = i+j; printf("%2d ",num[j]); r = 0; } else { n -= Form[i][j]; i++; } } num[6] = random(16)+1; printf("+%2d/n",num[6]); return num; } unsigned long C(int a ,int b) { int i ,j; unsigned long na = 1 ,nb = 1; for(i = 0;i < a;i++) { na *= (b-i); nb *= i+1; } return na/nb; } unsigned long A(int a ,int b) { int i; unsigned long na = 1; for(i = 0;i < a;i++) { na *= (b-i); } return na; } 程序中的那个制表只在程序的开始运行一次 并存储在Form中(我相信不会浪费很大内存)
这个程序虽然是机选程序 但是这个方法却可用做号码的保存 运算 显示 而且会显示出更高效方便的一面 在此不对其程序进行书写 |