关于产生不重复的数字,我们可能会想到采用以下方法
#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的使用上可能过于复杂,是否有更好的方法进行判定?