C语言关于把1-40的数,随机分成4组,并保证不重复F2

上个博客也进行讨论过关于把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;//定义一个指针,暂时指向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");
}
}

对于此方法,个人感觉还是过于繁杂,于是利用二维数组进行了,以下的更改

#include<stdio.h>
#include<stdlib.h>
int main()
{
    srand(time(NULL));
	int a[4][10], num[41];//采用二维数组
	int i, j = 0, k, n;
	for (i = 0; i < 41; i++) {
		num[i] = 1;//初始化num[i]=1
	}
	for (i = 0; i < 4; i++) {
		j = 0;//每次对j进行重新初始化
		do {
			n = rand() % 40 + 1;
			if (num[n]) {
				a[i][j] = n;
				num[n] = 0;
				j++;
			}
		} while (j < 10);
		printf("第%d组", i + 1);
		for (k = 0; k < 10; k++) {
			printf("%4d", a[i][k]);//对a[i]维的数组进行输出
		}printf("\n");//换行
	}

 看起来是比上一个程序更加的简单,但是其最核心的方法还是一样的,就是利用对所有的数进行赋值为1,再对生成过的数改为0,从而代表其为假,不能输出,从上面第一个程序中就能看出,如下

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

但是对此有一个更好的方法,先对定义一个数组,对每一个数组的元素赋予其对应的值,列如

for (i = 0; i < 41; i++) {
	num[i] = i;//初始num[i]的值
}

再随机在1-40生成一个数,输出,后将这个数对应的数组与这一轮循环最大的下标的数组进行替换,再将循环的范围进行缩小至1-39,照此类推,程序如下

#include<stdio.h>
#include<stdlib.h>
int main()
{
srand(time(NULL));
int num[41];
int i, j, t, cnt = 0;
int n, Max = 40;//规定最大值
for (i = 0; i < 41; i++) {
	num[i] = i;//初始num[i]的值
}
for (i = 0; i < 41; i++) {
	n = rand() % (Max - i) + 1;//使输出的数的范围逐次缩小
	printf("%4d", num[n]);//输出
	t = num[n];
	num[n] = num[Max - i];
	num[Max - i] = t;//使最后的一位数与已经输出的数进行替换,既能缩小最大数的范围,又能避免重复输出
	cnt++;
	if (cnt == 10) {//若输出的数达到10个,输出换行
		printf("\n");
		cnt = 0;//重新初始cnt
	}
}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值