算法第五节:解决“体彩29选7彩票组合”问题

来源:互联网 发布:苹果6s连不上移动数据 编辑:程序博客网 时间:2024/04/27 15:40

问题描述:假设有一个29选7的彩票,每注有7个1-29 的数字组成,且这7个数字不能相同,编写程序生成所有的号码组合。

算法分析:采用试探法可以逐步解出所有可能的组合,首先分析按照如下顺序生成彩票号码:
29 28 27 26 25 24 23
29 28 27 26 25 24 21
29 28 27 26 25 24 21
………..
29 28 27 26 25 24 1
29 28 27 26 25 23 22
………..
从上述排列顺序来看,在生成组合时首先变化最后一位,当最后一位为1时将试探计算倒数第二位,并且使该位值减1,到最后再变化最后一位,通过上述递归调用。

实现代码如下:

#include<stdio.h>#define MAXN 7      //设置每一注彩票的位数#define NUM 29      //设置组成彩票的数字int num[NUM];       //用来储存各生成的数字int lottery[MAXN];  //用来储存每注彩票的各个数字int i, j;void combine(int n, int m);//申明彩票号码生成函数int main(){    for (i = 0; i < NUM; i++)//设置彩票各位数字        num[i] = i + 1;    for (i = 0; i < MAXN; i++)        lottery[i] = 0;    combine(NUM, MAXN);    getchar();    return 0;}void combine(int n, int m){//彩票号码生成函数    for (i = n; i >= m; i--){        lottery[m - 1] = num[i - 1];//保存一位数字        if (m > 1)            combine(i - 1, m - 1);        else{                       //若m=1,输出一注号码            for (j = MAXN - 1; j >= 0; j--){                printf("%3d", lottery[j]);                    if (j%7==0)     //每输出7个数换一行                    printf("\n");            }        }    }}

运行结果如下:
这里写图片描述

原创粉丝点击