本帖最后由 孤不冷cing 于 2022-4-19 20:33 编辑 7 int main()
8 {
9 int a[3][18]={0};// 用于存放54个不重复的、[1,54]内的整数,并把他们分成三组
10 int (*p)[3][18]=&a;// 用于修改数组a中的值
11 int i,j,m,n;
12 int t;
13 int s=100;
14 int count=-1;// 后面用来与i比较,作为判断条件。因为是与i比较,所以初始化为-1。
15
16 for(i=0; i<3; i++)// 为每一个a中的元素赋值
17 {
18 srand(s++);
19 for(j=0; j<18; j++)
20 {
21 t = rand()%54+1;// 用中间变量t存储获得的随机数
22 for(m=i; m>=0; m--)// 靠n的值来判断随机数是否与之前获得的所有> 随机数都不相同
23 {
24 for(n=17; n>=0; n--)
25 {
26 if(t==a[m][n])
27 break;
28 }
29 if(n==-1)// 说明这一层里没有重复
30 count++;// 说明处理完了一层数组
31 }
32 if(n==-1 && count==i)
33 // 这个地方的判断有问题,单纯这一个条件,检测一维数组是否全部不相同没问题,但检测多维数组不行,因为m>0时,每次循环完,n必然为-1
34 // 这里的count表示n==-1条件满足了count+1次
35 {
36 (*p)[i][j]=t;
37 }
38
39 else
40 {
41 srand(s++);
42 j--;
43 }
44 }
45 }
46
47 for(i=0; i<3; i++)// 打印a中所有元素
48 {
49 for(j=0; j<18; j++)
50 {
51 printf("%d\n", a[i][j]);
52 }
53 }
54
55 return 0;
56 }
8 int main()
9 {
10 int a[54]={0};// 用于存放54个不重复的、[1,54]内的整数
11 int (*p)[54]=&a;// 用于修改数组a中的值
12 int i,j;
13 int t;
14 int s=100;
15 //int count=-1;// 后面用来与i比较,作为判断条件。因为是与i比较,所以初始化为-1 。
16
17 for(i=0; i<54; i++)// 为每一个a中的元素赋值
18 {
19 srand(s++);// 刷新seed,为了防止程序执行太快,把刷新放在循环外
20 t = rand()%54+1;// 用中间变量t存储获得的随机数
21 for(j=i; j>=0; j--)// 靠j的值来判断随机数是否与之前获得的所有随机数都> 不相同
22 {
23 if(t==a[j])
24 break;
25 }
26 if(j==-1)
27 {
28 (*p)[i]=t;
29 //printf("%d\n", t);
30 }
31 else
32 {
33 srand(s++);
34 i--;
35 }
36 }
37
38 for(i=0; i<54; i++)// 打印a中所有元素
39 {
40 printf("%d ", a[i]);
41 }
42 putchar('\n');
43
44 // 以下代码用于排序数组,以便检查是否满足无重复并且数量正好的要求
45 int b,c,d;
46 for(b=54;b>=0;b--)
47 {
48 for(c=0;c<b;c++)
49 {
50 if(a[c]>a[c+1])
51 {
52 d=a[c];
53 a[c]=a[c+1];
54 a[c+1]=d;
55 }
56 }
57 }
58
59 for(i=0; i<54; i++)// 打印a中所有元素
60 {
61 printf("%d ", a[i]);
62 }
63 putchar('\n');
64
65 return 0;
66 }
为什么第一个程序一直在循环啊,我找不出来死循环的原因
第二个就可以成功,啪一下就出结果了
本帖最后由 jhq999 于 2022-4-19 22:50 编辑
在内存里都是一维数组,多维数组声明只不过是给编译器看的,你也可以理解成一根绳子长54(p[54]),折成3段,每段长18(a[3][18]),其实就是同一根绳子
反过来
int p[54];
int (*a)[18]=(int(*)[18])p;
|