|
20鱼币
本帖最后由 孤不冷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;
|
最佳答案
查看完整内容
在内存里都是一维数组,多维数组声明只不过是给编译器看的,你也可以理解成一根绳子长54(p[54]),折成3段,每段长18(a[3][18]),其实就是同一根绳子
反过来
int p[54];
int (*a)[18]=(int(*)[18])p;
|