双色球C语言版

一、要求:产生五个红球,范围1-32,不可重复,并且从小到大排序

     产生一个蓝球,范围1-16

     输出格式 如:1 2 3 4 5 + 6

 

二、源码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <stdbool.h>
 4 
 5 int main(int argc, const char * argv[]) {
 6   int redBall[5] = {};
 7  
 8   //产生不重复的五个红球
 9   for (int i = 0; i < 5; i ++) {
10       int temp = arc4random() % 32 + 1;//mac Xcode产生随机数方法
11 
12       if  (i ==0) {
13         //第一个球直接赋值
14         redBall[0] = temp;
15         } else {
16         //判断是否重复
17         bool isExist = false;
18 
19         for (int j = 0; j < i + 1; j ++) {
20             if (temp == redBall[j]) {
21                 isExist = true;
22                 //重新得到浪费的机会
23                 i --;
24                 break;
25 
26             }
27                 
28         }
29 
30         //无重复,产生红色球
31         if (isExist == false) {
32             redBall[i] = temp;
33 
34         }
35     }
36       
37    }  
38    
39 
40    //对产生的红球排序,采用选择排序
41     int temp = 0;
42     for (int i = 0; i < 4; i ++) {
43         for (int j = i + 1; j < 5; j ++) {
44             if (redBall[i] > redBall [j]) {
45                 temp = redBall[i];
46                 redBall[i] = redBall [j];
47                 redBall[j] = temp;
48             }
49         }
50 
51     }
52 
53   //产生一个蓝球
54    int blueBall = arc4random () % 16 + 1;55     
56    //打印结果
57     for (int i = 0; i < 5; i ++) {
58         printf ("%d ", redBall[i]);
59     }   
60     printf ("+ %d\n", blueBall);
61    
62     return 0;
63 }                    

三、运行结果

四、要点

  本demo最大难点是产生五个不重复的红球

  我之前采用先产生五个球,再判断是否重复,如果重复,再产生五个球,直至产生五个不同的球,类似代码:

    while (1){
        int a = 0;//控制是否跳出循环
        //产生一个随机数数组
        for (int i = 0; i < 4; i ++) {
            ranArr [i] = arc4random() % 9 + 1;
            
        }
        
        //去掉重复的数字
        for (int i = 0; i < 4; i ++) {
            for (int j = 0; j < 4 && j != i; j ++) {
                if (ranArr [i] == ranArr [j]) {
                    a = 1;
                    break;
                }
            }
            if ( a == 1){
                break;
            }
        }
        if (a == 0) {
            break;
        }
    }

  但是明显不是最优。

  采用先产生一个数字,再判断是否重复,如果重复,这个数字不要,并且重新得到这次浪费的机会,直到不重复,将该数给球,可以说一点不浪费不重复的数字。

  

 

posted @ 2018-07-19 20:38  健泽  阅读(806)  评论(0编辑  收藏  举报