上个博客也进行讨论过关于把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
}
}
}