c语言关于如何在1-40中,利用数组随机选取两组,每组10个人,输出并保证不重复,再选取一个代表(除已经被选的数字)

关于产生不重复的数字,我们可能会想到采用以下方法

#include<stdio.h>
#include<stdlib.h>
int main()
{
    srand(time(NULL));
    int a[10];
    int i,j,n;
    for(i=0;i<10;i++){
     n=rand()%40+1;
     a[i]=n;
     for(j=0;j<i;j++){
     if(a[i]==a[j]
     i--;
     }
    }

}

但是这种方法似乎只适合于一个数组的时候,但当我们有两个或多个数组,我们又应该采用什么方法?

对于我们要保证数字不重复,我们可以定义另一个数组作为判定作用,列如:

int num[41]//以41为下标是为了保证数字40也能包含在内
for (i = 0; i < 41; i++)
num[i] = 1;//初始所有的数为1

这样可以假定所有的数字都是存在的或未利用的;以这样为基础,我们便可以利用这种思维进行生成不重复的两组数字

#include<stdio.h>
#include<stdlib.h>
int main()
{
 srand(time(NULL));
 int num[41];
 int a[10], b[10];
 int i, j=0;
 int n, m,t;
 for (i = 0; i < 41; i++)
	num[i] = 1;//初始所有的数为1
 do {
	n = rand() % 40 + 1;
	m = rand() % 40 + 1;//随机
	if (num[n] && num[m]&&n!=m) {//判定,若生成的数字都没有用过(即num[n]=1),便执行
		a[j] = n;
		b[j] = m;
		num[n] = 0;//让输出过的num变为0
		num[m] = 0;
		j++;//成功就加1
	}
 } while (j < 10);
 printf("第一组:\n");
 for (i = 0; i < 10; i++) {
	printf("%4d", a[i]);
 }
 printf("\n");
 printf("第二组:\n");
 for (i = 0; i < 10; i++) {
	printf("%4d", b[i]);
 }
 printf("\n");
 do {
	t = rand() % 40 + 1;
	if (num[t]) {
		printf("  裁判为:%d号\n", t);
	}
 } while (!num[t]);//若生成的的数字重复,则继续,直到不重复;
}

同时,关于在输出数组时,感觉步骤过于繁杂,对此,我对于该问题进行了修改,运用到了指针,修改如下:

int *z=NULL;//暂时指向NULL
for (i = 0; i < 2; i++) {
	printf("第%d组:\n", i + 1);
	switch (i) {
	case 0:
		z = a;
		break;
	case 1:
		z = b;
		break;
	}
	for (j = 0; j < 10; j++) {
		printf("%4d", *z++);//输出所对应的变量的值,并对指针的地址进行++
	}printf("\n");
}

并且我们可以利用此方法,进行关于1-40的数字,随机分成4组,并保证不重复,来解决问题;

如下:

#include<stdio.h>
#include<stdlib.h>
int main()
{
srand(time(NULL));
int num[41];
int a[10], b[10], c[10], d[10];//定义4个数组
int i, j=0;
int* z = NULL;
int n, m, t, f;
for (i = 1; i < 41; i++) {
	num[i] = 1;
}
do {
	n = rand() % 40 + 1;
	m = rand() % 40 + 1;
	t = rand() % 40 + 1;
	f = rand() % 40 + 1;
	if (num[n] && num[m] && num[t] && num[f] && n != m && n != t && n != f && m != t && m != f && t != f) {//判定
		a[j] = n;
		b[j] = m;
		c[j] = t;
		d[j] = f;
		num[n] = 0;
		num[m] = 0;
		num[t] = 0;
		num[f] = 0;
		j++;
	}
} while (j < 10);
for (i = 0; i < 4; i++) {
	printf("第%d组:\n", i + 1);
	switch (i) {
	case 0:
		z = a;
		break;
	case 1:
		z = b;
		break;
	case 2:
		z = c;
		break;
	case 3:
		z = d;
		break;
	}
	for (j = 0; j < 10; j++) {
		printf("%4d", *z++);
	}printf("\n");
}
}

但个人认为用这个方法在if的使用上可能过于复杂,是否有更好的方法进行判定?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值