经典算法_数组

1 对一个一维数组进行按照元素的升序大小进行排序,冒泡排序法

2 随机生成一个有10个元素的一维数组,并找出极值

3 将一个一维数组中n个整数按相反顺序存放

4 用指针方法对10个整数按照从大到小顺序排序,冒泡排序法

5 用随机数生成一个数组,写一个函数查找最小的,并返回最小数的地址。在主函数中打印出来最小数

6 不改变原有的一维数组排序,使用指针数组,进行排序,冒泡排序法

7 一维数组的逆转

8 有 N个数已按由小到大的顺序排好,要求输入一个数, 把它插入到原有序列中,而且仍然保持有序

9 用选择法对10个整数由大到小排序

10 用筛选法求 2到 100之间的素数。方法如下:首先 2是素数,凡 2 的倍数都不是素数,于是把这些数从数表中筛去, 2以后没有被筛去的第一个数是 3, 然后把 3的倍数都从数表中筛去, 3以后没被筛去的第一个数是 5,然后把 5 的倍数都从数表中筛去。如此下去,直到遇到某数 K(≤ N),其后没有数可筛选为止, 这时保留下的未被筛去的数就是 2到 N的素数

11 有17个人围成一圈(编号为0~16),从第 0号的人开始从 1报数, 凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。 问此人原来的位置是多少号?

可以使用数组解决,也可以使用循环链表解决。这里使用数组解决。

12 打印所有不超过 n( n<256)的其平方具有对称性的数(也称回文数)。

13 求N个数中的最大值,最大值出现的次数,然后求出次大值(次大值一定存在)。

14 圆盘上有如下图所示的二十个数,请找出哪四个相邻数之和为最大,并指出它们的起始位置及最大和的值。

clip_image001

15 将一个一维数组中的偶数依次交换。例如有8个元素, 若其中第1、4、5三元素是偶数时应按下图交换。

image

16 有n个整数,编程序将前面的各个数依次向后移动k个位置,最后k个数移到最前边的k个位置(见下图,其中n=8,k=3)。

1 2 3 4 5 6 7 8

6 7 8 1 2 3 4 5

image

思考: 程序中不许引入其它数组。

第一次,8 7 6 4 5 3 2 1

第二次,6 7 8 4 5 3 2 1

第三次,6 7 8 1 4 5 3 2

第四次,6 7 8 1 2 4 5 3

第五次,6 7 8 1 2 3 4 5

17 自然数N一般写成如下形式:

N=dk dk-1 d1 (d1~dk 均是十进制数字)

如果di+1 >di (i=k-1,k-2,...,1),则称N是严格降序数;如果di+1 <di (i=k-1,k-2,...,1),则称N是严格升序数;如果di+1 =di (i=k-1,k-2,...,1),则称N是等序数;此外,则称N是无序数。例如, 4321是严格降序数,1234是严格升序数,2222是等序数,1243是无序数。从键盘上输入一个大于9的整数N,判它属于上述哪一类。

18 已知A是有30个元素的整型数组,编写一个对A[I1]到A[I2](I1≤I2)之间的元素排序的函数(从大到小排序)。请调用上述函数先将A[5]至A[20]之间的元素排序,然后将A中的所有元素值输出。再调用上述函数对A[15]至A[29]之间的元素排序,最后再将A中30个元素值输出。

要求:1) 输入输出均由主函数实现。

2) 输出时每10个元素占1行。

19 编写求最大平台问题的程序。

有n个整数a1,a2, ... an, 若满足a1≤a2≤ ... ≤ an ,则认为在这n个数中有最大平台。在这种情况下,若n个数互不相同,则最大平台值为1,若在n个数中最多有连续m个整数的值相等,则最大平台值为m。

例如: n=10时

1,2,3,4,5,6,6,7,4,5 无最大平台

1,1,2,2,2,2,2,2,2,2 最大平台值为8

1,1,2,2,2,3,3,4,4,5 最大平台值为3

0,1,2,3,4,5,6,7,8,9 最大平台值为1

20 某桔农家共有2520只桔子, 父亲要将它们分给六个儿子,其分法如下:父亲先将2520只桔子分给六个儿子, 然后说:“老大,把你分到的桔子的八分之一给老二;老二拿到以后,连同原来的桔子分出七分之一给老三;老三拿到以后,连同原来的桔子分出六分之一给老四;老四拿到以后,连同原来的桔子分出五分之一给老五;老五拿到以后,连同原来的桔子分出四分之一给老六;老六拿到以后,连同原来的桔子分出三分之一给老大”。这样分完之后,六个儿子手里的桔子正好一样多。问六个儿子原先分到的桔子各是多少只?

21 间隔元素排序。用随机函数产生25个[25,75]之间的整数, 把它送到一维数组M中。要求对M[I],M[I+J],M[I+2*J],…这些元素按从小到大的顺序排序。J的值由键盘输入,I从1到J变化。实际上是以J为间隔排了J个对列,每个对列中从小到大排序。

22 求阶乘N!。

设输入的N最大可使N!达到100位,要求打印出全部有效数字。方法如下:用数组M[100]代表一个100位的数。M[1]代表最高位,M[100] 代表最低位。先对M[100]置1,其余各元素置零,然后从1到N进行累乘。同通常作乘法一样,数组M与I(1≤I≤N)相乘时,从低位数乘起,乘积大于9时进到上一位去,然后将结果打印(从头一个不等于零的位开始)。

23 编写“N个人放鞭炮问题的程序”。

N个人同时刻开始放鞭炮, 第一个人每隔T1秒放一次,第二个人每隔T2秒放一次,...第N个人每隔Tn秒放一次。每个人各放M个鞭炮。问总共能听到多少次鞭炮声。

24 十个数字组成完全平方数。

把0、1、2、3、4、5、6、7、8、9十个数字分别组成一个一位数,一个二位数,一个三位数和一个四位数,使它们都是完全平方数(其平方根是整数),共有几种方法? 每种方法的结果是什么? (每个数字只允许用一次)。下边就是一种填法:

1 ( 1 )

36 ( 6 )

784 ( 28 )

9025 ( 95 )

-----------------------------二维数值

9 对一个二维数组进行转置

10 打印杨辉三角形,包括直角三角形和等腰三角形

11 有一个班,3个学生,各学4门课,计算总平均分以及第n个学生的成绩。查找有一门以上课程不及格的学生,输出该学生的所有成绩

12 打印如下形式的杨辉三角形

              1

              1   1

              1   2   1

              1   3   3   1

              1   4   6   4   1

              1   5   10  10  5   1

输出前10行,从 0行开始,分别用一维数组和二维数组实现

13 把一个二维实型数组a按照第0列的元素进行排序(由小到大排序,用起泡法)。例如:如果a[i][0]大于a[i+1][0],则i行与i+1行中所有元素都要进行对换

14 编程产生如下形式的方阵。

              1  2  2  2  2  2  1

              3  1  2  2  2  1  4

              3  3  1  2  1  4  4

              3  3  3  1  4  4  4

              3  3  1  5  1  4  4

              3  1  5  5  5  1  4

              1  5  5  5  5  5  1

        要求:不允许使用键盘输入语句和静态赋值语句,尽量少用循环。

15 找出 M×N 数组中所有不相邻元素,并求出它们的和(相邻的数:前一个是偶数,后一个是素数)。

16 打印魔方阵。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如:三阶魔方阵为

                        8  1  6

                        3  5  7

                        4  9  2

    要求打印由 1到的自然数构成的魔方阵。

    提示:魔方阵中各数的排列规律如下:

      ⑴  将“1”放在第一行中间一列;

      ⑵  从“2”开始直到n×n为止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1;

      ⑶  如果上一个数的行数为1,则下一个数的行数为 n(指最下一行);

      ⑷  当一个数的列数为 n,下一个数的列数应为1,行数减1;

      ⑸  如果按上面规则确定的位置已有数,或上一个数是第 1行第 n列时, 则把下一个数放在上一个数的下面。

17 找规律,编程序打印6×6的矩阵:

   1   2   3   5   8   13

   1   4   9  17  30   51

   1   6  19  45  92  173

       . . .

18 已知M1是3×5的矩阵, M2是5×2的矩阵, 编程序求出M1与M2之积。

19 找规律填写N×N方阵。如N=8时, 其方阵为:

1  1  1  1  1  1  1  1

1  2  2  2  2  2  2  1

1  2  3  3  3  3  2  1

1  2  3  4  4  3  2  1

1  2  3  4  4  3  2  1

1  2  3  3  3  3  2  1

1  2  2  2  2  2  2  1

1  1  1  1  1  1  1  1

20 求N阶方阵(即N×N数组)中各条反斜线上的元素之和。如4×4数组共有7条反斜线:

image

注:求和时,请按斜线编号顺序显示求出的和。

21 编写程序,按照 1,2, ... , 28的顺序填一个7×7数组的左上角,程序的输出结果为:

    1    2    4    7   11   16   22

    3    5    8   12   17   23

    6    9   13   18   24

   10   14   19   25

   15   20   26

   21   27

   28

22 二维数组排序。设有4×5的数组M,通过排序使M[1][1]≤M[1][2]≤...≤M[1][5]≤M[2][1]≤M[2][2]≤...≤M[2][5]≤...≤M[4][1]≤M[4][2]≤...≤M[4][5]。排序时不允许引入其它数组。

--------------------------------------------------------------

 

1 对一个一维数组进行按照元素的升序大小进行排序,冒泡排序法

 1 #include<stdio.h>
 2 
 3 void sort(int * a, int len)
 4 {
 5     int i, j, t;
 6     for (i = 0;i < len - 1;++i)
 7     {
 8         for (j = 0;j < len - 1 - i;++j)
 9         {
10             if (a[j] > a[j + 1])        /* >表示升序 <表示降序 */
11             {
12                 t = a[j];
13                 a[j] = a[j + 1];
14                 a[j + 1] = t;
15             }
16         }
17     }
18 }
19 
20 main()
21 {
22     int a[6] = { 10,2,8,-8,11,0 };
23     int i = 0;
24 
25     sort(a, 6);
26 
27     for (i = 0;i < 6;++i)
28     {
29         printf("%d ", a[i]);
30     }
31     printf("
");
32 }

2 随机生成一个有10个元素的一维数组,并找出极值

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 #include<time.h>
 6 
 7 
 8 main()
 9 {
10     time_t ts;
11 
12     srand((unsigned int)time(&ts));
13 
14     int a[10];
15     int i;
16     int max;//用于保存最大值
17     int maxi;//用于保存最大值的下标
18     int min;
19     int mini;
20 
21     for (i = 0;i < 10;i++)
22     {
23         a[i] = rand() % 100;
24         printf("%d,%x
", a[i], &a[i]);
25     }
26 
27     max = a[0];//假设第一个是最大的数
28     maxi = 0;//
29     min = a[0];//假设第一个是最小的数
30     mini = 0;//
31 
32     for (i = 1;i < 10;i++)//选择比较
33     {
34         if (a[i] > max)
35         {
36             max = a[i];
37             maxi = i;
38         }
39     }
40 
41     for (i = 1;i < 10;i++)//选择比较
42     {
43         if (a[i] < min)
44         {
45             min = a[i];
46             mini = i;
47         }
48     }
49 
50     printf("最大值是%d,下标是%d
", max, maxi);
51     printf("最小值是%d,下标是%d
", min, mini);
52 
53     system("pause");
54 }

3 将一个一维数组中n个整数按相反顺序存放

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 
 6 void change(int a[], int n)
 7 {
 8     int i;
 9     int temp;
10 
11     //数组没有副本机制,等价于直接操作原生数组
12     for (i = 0;i < n / 2;i++)//数据的循环对调
13     {
14         temp = a[i];//数组的交换
15         a[i] = a[n - 1 - i];
16         a[n - 1 - i] = temp;
17     }
18 }
19 
20 main()
21 {
22     int a[10] = { 1,2,3,4,5,6,7,8,9,0 };
23     int i;
24 
25     for (i = 0;i < 10;i++)
26     {
27         printf("%4d", a[i]);
28     }
29 
30     change(a, 10);
31     printf("
");
32 
33     for (i = 0;i < 10;i++)
34     {
35         printf("%4d", a[i]);
36     }
37 
38     system("pause");
39 }

4 用指针方法对10个整数按照从大到小顺序排序,冒泡排序法

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 
 6 void sort(int *p, int n)
 7 {
 8     int i, j;
 9     int temp;
10 
11     for (i = 0;i < n - 1;i++)
12     {
13         for (j = 0;j < n - 1 - i;j++)
14         {
15             if (*(p + j) < *(p + j + 1))
16             {
17                 temp = *(p + j);//交换数据实现冒泡
18                 *(p + j) = *(p + j + 1);
19                 *(p + j + 1) = temp;
20             }
21         }
22     }
23 }
24 
25 main()
26 {
27     int a[11] = { 1,2,13,4,5,16,7,8,9,10,29 };
28     int i;
29 
30     for (i = 0;i < 11;i++)
31     {
32         printf("%4d", a[i]);
33     }
34 
35     sort(a, 11);
36     printf("
");
37 
38     for (i = 0;i < 11;i++)
39     {
40         printf("%4d", a[i]);
41     }
42 
43     system("pause");
44 }

5 用随机数生成一个数组,写一个函数查找最小的,并返回最小数的地址。在主函数中打印出来最小数

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 #include<time.h>
 6 
 7 int a = 100;
 8 int b = 10;
 9 
10 //函数,返回一个地址,对于数组而言,函数参数调用没有副本机制,为了节约内存
11 int * mindata(int a[], int n)//查找最小数
12 {
13     int *p = NULL;//保存最小数的地址
14     int min = a[0];
15     p = &a[0];
16     int i;
17 
18     for (i = 0;i < n;i++)//选择法,选择最小的
19     {
20         if (a[i] < min)
21         {
22             min = a[i];//min确保是最小的值
23             p = &a[i];//p指向最小数的地址
24         }
25     }
26     printf("min=%d
", min);
27     return p;
28 }
29 
30 main()
31 {
32     time_t ts;
33     srand((unsigned int)time(&ts));
34     
35     int a[10];
36     int i;
37     int min = 0;
38 
39     for (i = 0;i < 10;i++)
40     {
41         a[i] = rand() % 100;
42         printf("%d
", a[i]);
43     }
44     int *p = mindata(a, 10);
45 
46     //修改最小数
47     *p = 200;
48 
49     printf("
");
50     //查看修改以后的数组
51     for (i = 0;i < 10;i++)
52     {
53         printf("%d
", a[i]);
54     }
55 
56     system("pause");
57 }

  

6 不改变原有的一维数组排序,使用指针数组,进行排序,冒泡排序法

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 
 6 main()
 7 {
 8     const int num[5] = { 12000,200,300,900,400 };//只读数组
 9     int *p[5] = { &num[0],&num[1],&num[2],&num[3],&num[4] };//构建指针数组,分别存储常量数组的每一个元素的地址
10     int i, j;
11     int **pp = NULL;
12     int *t;
13 
14     printf("原有数组
");
15     for (i = 0;i < 5;i++)//下标循环的方式
16     {
17         printf("%d
", num[i]);
18     }
19     printf("
");
20 
21     printf("排序以前
");
22     for (i = 0;i < 5;i++)//下标循环的方式
23     {
24         printf("%d,%d
", *p[i], *(*(p + i)));//p[i]是一个地址,*p[i]取出内容
25     }//p[i]等价于*(p + i)
26     
27     for (pp = p;pp < p + 5;pp++)//指针循环的方式,访问指针数组,需要二级指针
28     {
29         printf("%d
", **pp);
30     }
31 
32     for (i = 0;i < 5 - 1;i++)//剩下一个可以忽略,5-1
33     {
34         for (j = 0;j < 5 - 1 - i;j++)
35         {
36             if (*p[j] < *p[j + 1])
37             {
38                 t = p[j];
39                 p[j] = p[j + 1];
40                 p[j + 1] = t;
41             }
42         }
43     }
44 
45     printf("原有数组
");
46     for (i = 0;i < 5;i++)//下标循环的方式
47     {
48         printf("%d
", num[i]);
49     }
50     printf("
");
51 
52     printf("排序以后
");
53     for (i = 0;i < 5;i++)//下标循环的方式
54     {
55         printf("%d,%d
", *p[i], *(*(p + i)));//p[i]是一个地址,*p[i]取出内容
56     }//p[i]等价于*(p + i)
57 
58     system("pause");
59 }

7 一维数组的逆转

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 
 6 void rev(int a[], int n)
 7 {
 8     int i;
 9     int temp;
10 
11     for (i = 0;i < n / 2 - 1;i++)
12     {
13         temp = a[i];
14         a[i] = a[n - 1 - i];
15         a[n - 1 - i] = temp;
16     }
17 }
18 
19 void rev1(int *a, int n)//数组名作为形式参数,就是一个指针,所以用指针也没问题
20 {
21     int i;
22     int temp;
23 
24     for (i = 0;i < n / 2 - 1;i++)
25     {
26         temp = a[i];
27         a[i] = a[n - 1 - i];
28         a[n - 1 - i] = temp;
29     }
30 }
31 
32 void rev2(int *a, int n)//指针循环
33 {
34     int i;
35     int temp;
36 
37     for (i = 0;i < n / 2 - 1;i++)
38     {
39         temp = *(a + i);
40         *(a + i) = *(a + n - 1 - i);
41         *(a + n - 1 - i) = temp;
42     }
43 }
44 
45 void rev3(int a[], int n)
46 {
47     int i;
48     int temp;
49 
50     for (i = 0;i < n / 2 - 1;i++)
51     {
52         temp = *(a + i);
53         *(a + i) = *(a + n - 1 - i);
54         *(a + n - 1 - i) = temp;
55     }
56 }
57 
58 main()
59 {
60     int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
61     int *p = a;
62     int i;
63     int n = sizeof(a) / sizeof(int);
64     
65     for (i = 0;i < n;i++)
66     {
67         printf("%d
", a[i]);
68     }
69 
70     //rev(a, n);
71     //rev1(a, n);
72     //rev2(a, n);
73     rev3(p, n);
74 
75     printf("逆序
");
76     for (i = 0;i < n;i++)
77     {
78         printf("%d
", a[i]);
79     }
80 
81     system("pause");
82 };

8 有 N个数已按由小到大的顺序排好,要求输入一个数, 把它插入到原有序列中,而且仍然保持有序

 1 #include<stdio.h>
 2 
 3 #define N 11
 4 
 5 void printarr(int arr[], int n)//打印数组
 6 {
 7     int i;
 8 
 9     for (i = 0; i < n; i++)
10     {
11         printf("%4d", arr[i]);
12     }
13 
14     printf("
");
15 }
16 
17 main()
18 {
19     int arr[N] = { 1,2,3,4,5,7,8,9,10,11 };
20     int num = 6;//要插入的数
21     int i;
22     int j;
23 
24     printarr(arr, N - 1);//打印数组
25 
26     for (i = 0; i < N; i++)//外循环,遍历数组
27     {
28         if (arr[i] > num)//如果找到比插入的数更大的数
29         {
30             for (j = 9; j >= i; j--)//内循环,最后一位开始往后移动
31             {
32                 arr[j + 1] = arr[j];
33             }
34 
35             arr[i] = num;//插入
36 
37             break;//记得break,不然往后一直是要插入的数6
38         }
39     }
40 
41     printarr(arr, N);//打印数组
42 
43     system("pause");
44 }

9 用选择法对10个整数由大到小排序

 1 #include<stdio.h>
 2 #include<time.h>
 3 
 4 #define N 10
 5 
 6 void selectionsort(int arr[], int n)//选择排序法
 7 {
 8     int i;
 9     int j;
10     int max;//存储最大值下标
11 
12     for (i = 0; i < n - 1; i++)//外循环
13     {
14         max = i;//假设当前为最大值
15 
16         for (j = i + 1; j < n; j++)//内循环
17         {
18             if (arr[j] > arr[max])//如果找到更大值
19             {
20                 max = j;//变更max
21             }
22         }
23 
24         if (max != i)//如果max发生变更,交换
25         {
26             arr[max] ^= arr[i];
27             arr[i] ^= arr[max];
28             arr[max] ^= arr[i];
29         }
30     }
31 }
32 
33 main()
34 {
35     time_t ts;
36     srand((unsigned int)time(&ts));
37     int arr[N] = { 0 };
38     int i;
39 
40     for (i = 0; i < N; i++)
41     {
42         arr[i] = rand() % 1000;
43         printf("arr[%d]=%d
", i, arr[i]);
44     }
45 
46     selectionsort(arr, N);//选择排序法
47 
48     printf("after
");
49 
50     for (i = 0; i < N; i++)
51     {
52         printf("arr[%d]=%d
", i, arr[i]);
53     }
54 
55     system("pause");
56 }

10 用筛选法求 2到 100之间的素数。方法如下:首先 2是素数,凡 2 的倍数都不是素数,于是把这些数从数表中筛去, 2以后没有被筛去的第一个数是 3, 然后把 3的倍数都从数表中筛去, 3以后没被筛去的第一个数是 5,然后把 5 的倍数都从数表中筛去。如此下去,直到遇到某数 K(≤ N),其后没有数可筛选为止, 这时保留下的未被筛去的数就是 2到 N的素数

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 #include <math.h>
 6 
 7 #define N 101
 8 
 9 main()
10 {
11     int arr[N];//创建数组
12     int i;//数组下标
13     int j;//数组下标
14 
15     for (i = 0; i < N; i++)
16     {
17         arr[i] = 1;//初始化数组,先默认都是素数,1是素数,0不是素数
18     }
19 
20     arr[0] = arr[1] = 0;//0和1不是素数
21 
22     for (i = 2; i < sqrt(N - 1); i++)//从2开始循环
23     {
24         while (!arr[i])//排除非素数,最后定向i为素数
25         {
26             i++;
27         }
28 
29         for (j = i + i; j < N; j = j + i)//从i的2倍开始,每次递增倍数
30         {
31             arr[j] = 0;//i的倍数不是素数
32         }
33     }
34 
35     for (i = 0; i < N; i++)
36     {
37         if (arr[i])//1是素数,0不是素数
38         {
39             printf("%d
", i);
40         }
41     }
42 
43     system("pause");
44 }

11 有17个人围成一圈(编号为0~16),从第 0号的人开始从 1报数, 凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。 问此人原来的位置是多少号?

可以使用数组解决,也可以使用循环链表解决。这里使用数组解决。

i = i % length + 1;//利用求余%运算,i在1~length之间循环

index = (index + 1) % m;//利用求余%运算,index在0~m-1之间循环

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 void main()
 5 {
 6     int length = 17;//总人数17个人
 7     int m = 3;//报到 3的倍数的人离开圈子
 8     int index = 0;//报数
 9     int count = 0;//out的人数
10     int i = 0;//数组下标
11     int a[100] = { 0 };//初始化数组,0在场,1不在场
12 
13     while (1)//死循环,直到out的人数等于总人数
14     {
15         i = i % length + 1;//利用求余%运算,i在1~length之间循环
16 
17         if (a[i] == 0)//0在场,1不在场
18         {
19             index = (index + 1) % m;//利用求余%运算,index在0~m-1之间循环
20             if (index == 0)
21             {
22                 count++;//out的人数增加
23                 a[i] = 1;//0在场,1不在场
24                 printf("这次out的人原来的位置是%d号
", i);
25             }
26         }
27 
28         if (length == count)//死循环,直到out的人数等于总人数
29         {
30             break;
31         }
32     }
33 
34     system("pause");
35 }

12 打印所有不超过 n( n<256)的其平方具有对称性的数(也称回文数)。

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 
 6 int getwei(int num)
 7 {
 8     if (num < 10)
 9     {
10         return 1;
11     }
12     else
13     {
14         return getwei(num / 10) + 1;
15     }
16 }
17 
18 int huiwen(int num)
19 {
20     int i;
21     int a[10] = { 0 };//初始化数组
22     int wei = getwei(num);//得到位数
23     int flag = 1;//1是回文数,0不是回文数
24 
25     for (i = 0; i < wei; i++)//不断取出数字,保存到数组
26     {
27         a[i] = num % 10;//取出最后一位
28         num /= 10;//去掉最后一位,保留前面数字
29     }
30 
31     for (i = 0; i < wei / 2; i++)//判断一半即可
32     {
33         if (a[i] != a[wei - 1 - i])//如果发现不是回文
34         {
35             flag = 0;//1是回文数,0不是回文数
36             break;
37         }
38     }
39 
40     return flag;
41 }
42 
43 void main()
44 {
45     int i;
46     int n = 256;
47 
48     for (i = 0; i < n; i++)
49     {
50         if (huiwen(i*i))
51         {
52             printf("%d * %d = %d
", i, i, i*i);
53         }
54     }
55 
56     system("pause");
57 }

13 求N个数中的最大值,最大值出现的次数,然后求出次大值(次大值一定存在)。

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 #include <time.h>
 6 
 7 #define N 10
 8 
 9 void searchMax1_Max2(int arr[], int num, int *pamx1, int *pamx2, int *pmax1_count)
10 {
11     int i;
12     *pamx1 = 0;//最大值,必须初始化为0
13     *pamx2 = 0;//次大值,必须初始化为0
14     
15     for (i = 0; i < N; i++)
16     {
17         if (arr[i] > *pamx1)//找到比原来的最大值还大
18         {
19             *pmax1_count = 1;//恢复1
20             *pamx2 = *pamx1;//原来的最大值变成次大值
21             *pamx1 = arr[i];//保存新的最大值
22         }
23         else if (arr[i] == *pamx1)//找到重复的最大值
24         {
25             (*pmax1_count)++;//次数+1
26         }
27         else if (arr[i] > *pamx2 && arr[i] < *pamx1)//找到比原来的次大值还大,且比最大值还小
28         {
29             *pamx2 = arr[i];//保存新的次大值
30         }
31         else
32         {
33             continue;//继续循环
34         }
35     }
36 }
37 
38 void main()
39 {
40     time_t ts;
41     srand((unsigned int)time(&ts));
42     int i;
43     int arr[N] = { 0 };//初始化数组
44     int max1 = 0;//保存最大值
45     int max2 = 0; //保存次大值
46     int max1_count = 1;//肯定存在最大值
47 
48     for (i = 0; i < N; i++)
49     {
50         arr[i] = rand() % 10;
51         printf("arr[%d]=%d
", i, arr[i]);
52     }
53 
54     searchMax1_Max2(arr, N, &max1, &max2, &max1_count);//寻找最大值,次大值,和最大值出现的次数
55 
56     printf("max1=%d,max2=%d,max1_count=%d", max1, max2, max1_count);
57 
58     system("pause");
59 }

14 圆盘上有如下图所示的二十个数,请找出哪四个相邻数之和为最大,并指出它们的起始位置及最大和的值。

一维数组模拟圆,使用%来实现圆的循环,类似出圈游戏

clip_image001[4]

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 
 6 #define N 20
 7 
 8 void main()
 9 {
10     int a[N] = { 20,1,8,4,13,6,10,15,2,17,3,19,7,16,8,11,14,9,12,5 };
11     int b[N] = { 0 };///相邻四个数之和,放入b[N]
12     int i;
13     int max = 0;//保存最大值
14     int index = 0;//保存最大值的下标
15 
16     for (i = 0; i < N; i++)
17     {
18         b[i] = a[i] + a[(i + 1) % N] + a[(i + 2) % N] + a[(i + 3) % N];//一维数组模拟圆,使用%来实现圆的循环,类似出圈游戏
19     }
20 
21     max = b[0];
22 
23     for (i = 0; i < N; i++)
24     {
25         printf("b[%d]=%d
", i, b[i]);
26     }
27 
28     for (i = 1; i < N; i++)
29     {
30         if (b[i] > max)
31         {
32             index = i;
33             max = b[i];
34         }
35     }
36 
37     printf("index=%d,max=%d
", index + 1, max);
38 
39     system("pause");
40 }

15 将一个一维数组中的偶数依次交换。例如有8个元素, 若其中第1、4、5三元素是偶数时应按下图交换。

image

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define N 8
 4 
 5 int *getFirst(int arr[], int n)//返回第一个偶数的地址
 6 {
 7     int *pFirst = NULL;//保存地址
 8     for (int *p = arr; p < arr + n; p++)//从前到后
 9     {
10         if (!(*p % 2))
11         {
12             pFirst = p;
13             break;
14         }
15     }
16     return pFirst;
17 }
18 
19 int *getLast(int arr[], int n)//返回最后一个偶数的地址
20 {
21     int *pLast = NULL;//保存地址
22     for (int *p = arr + n - 1; p >= arr; p--)//从后到前
23     {
24         if (!(*p % 2))
25         {
26             pLast = p;
27             break;
28         }
29     }
30     return pLast;
31 }
32 
33 void main()
34 {
35     int arr[N] = { 2,3,1,6,8,7,9,5 };//初始化数组
36     int i;
37 
38     for (i = 0; i < N; i++)
39     {
40         printf("%5d", arr[i]);
41     }
42 
43     int *pLast = getLast(arr, N);//返回最后一个偶数的地址
44     int lastValue = *pLast;//保存最后一个偶数的值
45 
46     int *pFirst = getFirst(arr, N);//返回第一个偶数的地址
47 
48     for (int *p = pLast - 1; p >= pFirst; p--)//从最后一个偶数的前一个地址开始往前循环,到第一个偶数为止
49     {
50         if (!(*p % 2))
51         {
52             *pLast = *p;//往后赋值
53             pLast = p;//将当前偶数赋给标识变量pLast
54         }
55     }
56 
57     *pFirst = lastValue;//第一个偶数的地址,需要赋上当初最后一个偶数的值
58 
59     printf("
调整以后
");
60     for (i = 0; i < N; i++)
61     {
62         printf("%5d", arr[i]);
63     }
64     
65     system("pause");
66 }

16 有n个整数,编程序将前面的各个数依次向后移动k个位置,最后k个数移到最前边的k个位置(见下图,其中n=8,k=3)。

1 2 3 4 5 6 7 8

6 7 8 1 2 3 4 5

image

思考: 程序中不许引入其它数组。

第一次,8 7 6 4 5 3 2 1

第二次,6 7 8 4 5 3 2 1

第三次,6 7 8 1 4 5 3 2

第四次,6 7 8 1 2 4 5 3

第五次,6 7 8 1 2 3 4 5

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 #define N 8
 5 
 6 void print(int arr[], int n)
 7 {
 8     int i;
 9 
10     for (i = 0; i < n; i++)
11     {
12         printf("%5d", arr[i]);
13     }
14     printf("
");
15 }
16 
17 void main()
18 {
19     int arr[N] = { 1,2,3,4,5,6,7,8 };
20     int k = 3;
21     int i;
22     int temp = 0;
23     int j;
24 
25     print(arr, N);
26 
27     for (i = 0; i < 3; i++)//第一步,对调前k项和后k项
28     {
29         temp = arr[i];
30         arr[i] = arr[N - 1 - i];
31         arr[N - 1 - i] = temp;
32     }
33 
34     print(arr, N);//8 7 6 4 5 3 2 1
35 
36     for (i = 0; i < k / 2; i++)//第二步,前k项逆序
37     {
38         temp = arr[i];
39         arr[i] = arr[k - 1 - i];
40         arr[k - 1 - i] = temp;
41     }
42 
43     print(arr, N);//6 7 8 4 5 3 2 1
44 
45     for (i = k; i < 2 * k; i++)
46     {
47         temp = arr[N - 1];//存储最后一个元素
48                             
49         for (j = N - 2; j > i - 1; j--)//后N - k - 1个元素向后移动
50         {
51             arr[j + 1] = arr[j];
52         }
53         arr[i] = temp;//原来最后一个元素向前
54 
55         print(arr, N);
56     }
57 }

17 自然数N一般写成如下形式:

N=dk dk-1 d1 (d1~dk 均是十进制数字)

如果di+1 >di (i=k-1,k-2,...,1),则称N是严格降序数;如果di+1 <di (i=k-1,k-2,...,1),则称N是严格升序数;如果di+1 =di (i=k-1,k-2,...,1),则称N是等序数;此外,则称N是无序数。例如, 4321是严格降序数,1234是严格升序数,2222是等序数,1243是无序数。从键盘上输入一个大于9的整数N,判它属于上述哪一类。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 
  5 #define N 10
  6 
  7 int arr[N] = { 0 };//初始化数组0
  8 
  9 int isequal(int n)//等序返回1
 10 {
 11     if (n == 1)
 12     {
 13         return arr[n - 1] == arr[n];
 14     }
 15     else
 16     {
 17         return (arr[n - 1] == arr[n]) && isequal(n - 1);
 18     }
 19 }
 20 
 21 int isminus(int n)//降序返回1
 22 {
 23     if (n == 1)
 24     {
 25         return arr[n - 1] > arr[n];
 26     }
 27     else
 28     {
 29         return (arr[n - 1] > arr[n]) && isminus(n - 1);
 30     }
 31 }
 32 
 33 int isadd(int n)//升序返回1
 34 {
 35     if (n == 1)
 36     {
 37         return arr[n - 1] < arr[n];
 38     }
 39     else
 40     {
 41         return (arr[n - 1] < arr[n]) && isadd(n - 1);
 42     }
 43 }
 44 
 45 int getwei(int n)//返回整数位数
 46 {
 47     if (n < 10)
 48     {
 49         return 1;
 50     }
 51     else
 52     {
 53         return getwei(n / 10) + 1;
 54     }
 55 }
 56 
 57 void arrSet(int arr[], int num)//把整数各位存放到数组
 58 {
 59     memset(arr, -1, sizeof(arr));//初始化数组-1
 60     int i;
 61     int wei = getwei(num);//返回整数位数
 62 
 63     for (i = wei - 1; i >= 0; i--)//把整数各元素放入数组
 64     {
 65         arr[i] = num % 10 + 48;
 66         num /= 10;
 67     }
 68 }
 69 
 70 void arrJudge(int arr[], int num)//判断整数
 71 {
 72     int wei = getwei(num);//返回整数位数
 73 
 74     if (num <= 9)
 75     {
 76         printf("从键盘上输入一个大于9的整数
");
 77     }
 78     else if (isadd(wei - 1))
 79     {
 80         printf("严格升序数
");
 81     }
 82     else if (isminus(wei - 1))
 83     {
 84         printf("严格降序数
");
 85     }
 86     else if (isequal(wei - 1))
 87     {
 88         printf("等序数
");
 89     }
 90     else
 91     {
 92         printf("无序数
");
 93     }
 94 }
 95 
 96 void main()
 97 {
 98     int num = 1234;
 99     
100     arrSet(arr, num);//把整数各位存放到数组
101 
102     arrJudge(arr, num);//判断整数
103     
104     system("pause");
105 }

18 已知A是有30个元素的整型数组,编写一个对A[I1]到A[I2](I1≤I2)之间的元素排序的函数(从大到小排序)。请调用上述函数先将A[5]至A[20]之间的元素排序,然后将A中的所有元素值输出。再调用上述函数对A[15]至A[29]之间的元素排序,最后再将A中30个元素值输出。

要求:1) 输入输出均由主函数实现。

2) 输出时每10个元素占1行。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 
 5 #define N 30
 6 
 7 void sortPart(int arr[], int n, int i1, int i2)//仅对arr[i1]->arr[i2]之间的元素进行排序,冒泡排序
 8 {
 9     int i;
10     int j;
11     int temp;
12 
13     for (i = n - i2 - 1; i < n - 1; i++)//i = n - i2 - 1
14     {
15         for (j = i1; j < n - 1 - i; j++)//j = i1
16         {
17             if (arr[j] > arr[j + 1])
18             {
19                 temp = arr[j];
20                 arr[j] = arr[j + 1];
21                 arr[j + 1] = temp;
22             }
23         }
24     }
25 }
26 
27 void main()
28 {
29     time_t ts;
30     srand((unsigned int)time(&ts));
31     int A[N] = { 0 };//数组
32     int i = 0;//数组下标
33     int i1 = 0;//数组下标
34     int i2 = 0;//数组下标
35 
36     for (i = 0; i < N; i++)//打印
37     {
38         A[i] = rand() % 100;//初始化数组
39 
40         printf("%5d", A[i]);
41 
42         if (!((i + 1) % 10))//输出时每10个元素占1行
43         {
44             printf("
");
45         }
46     }
47 
48     printf("先将A[5]至A[20]之间的元素排序,然后将A中的所有元素值输出
");
49 
50     i1 = 5;//修改下标
51     i2 = 20;//修改下标
52 
53     sortPart(A, N, i1, i2);//仅对i1至i2至今的元素进行排序,冒泡
54 
55     for (i = 0; i < N; i++)//打印
56     {
57         printf("%5d", A[i]);
58 
59         if (!((i + 1) % 10))//输出时每10个元素占1行
60         {
61             printf("
");
62         }
63     }
64 
65     printf("再调用上述函数对A[15]至A[29]之间的元素排序,最后再将A中30个元素值输出
");
66 
67     i1 = 15;//修改下标
68     i2 = 29;//修改下标
69 
70     sortPart(A, N, i1, i2);//仅对arr[i1]->arr[i2]之间的元素进行排序,冒泡排序
71 
72     for (i = 0; i < N; i++)//打印
73     {
74         printf("%5d", A[i]);
75 
76         if (!((i + 1) % 10))//输出时每10个元素占1行
77         {
78             printf("
");
79         }
80     }
81 }

19 编写求最大平台问题的程序。

有n个整数a1,a2, ... an, 若满足a1≤a2≤ ... ≤ an ,则认为在这n个数中有最大平台。在这种情况下,若n个数互不相同,则最大平台值为1,若在n个数中最多有连续m个整数的值相等,则最大平台值为m。

例如: n=10时

1,2,3,4,5,6,6,7,4,5 无最大平台

1,1,2,2,2,2,2,2,2,2 最大平台值为8

1,1,2,2,2,3,3,4,4,5 最大平台值为3

0,1,2,3,4,5,6,7,8,9 最大平台值为1

 1 #include <stdio.h>
 2 #define N 10
 3 
 4 int platformExist(int arr[], int n);//判断是否有最大平台
 5 int platformOnly(int arr[], int n);//判断最大平台值是否为1
 6 int platformBiggest(int arr[], int n);//获取最大平台值
 7 
 8 void main()
 9 {
10     int arr[N] = { 1, 1, 2, 2, 2, 2, 2, 2, 2, 2 };
11 
12     if (platformExist(arr, N))//判断是否有最大平台
13     {
14         if (platformOnly(arr, N))//判断最大平台值是否为1
15         {
16             printf("最大平台值为1
");
17         }
18         else
19         {
20             printf("最大平台值为%d
", platformBiggest(arr, N));//获取最大平台值
21         }
22     }
23     else
24     {
25         printf("无最大平台
");
26     }
27 }
28 
29 int platformExist(int arr[], int n)//判断是否有最大平台
30 {
31     int i = 0;//数组下标
32     int flag = 1;//默认有最大平台
33 
34     for (i = 0; i < N - 1; i++)
35     {
36         if (arr[i] > arr[i + 1])
37         {
38             flag = 0;
39             break;
40         }
41     }
42 
43     return flag;
44 }
45 
46 int platformOnly(int arr[], int n)//判断最大平台值是否为1
47 {
48     int i = 0;//数组下标
49     int flag = 1;//默认最大平台值为1
50 
51     for (i = 0; i < N - 1; i++)
52     {
53         if (arr[i] == arr[i + 1])
54         {
55             flag = 0;
56             break;
57         }
58     }
59 
60     return flag;
61 }
62 
63 int platformBiggest(int arr[], int n)//获取最大平台值
64 {
65     int i = 0;//数组下标
66     int j = 0;//数组下标
67     int max = 0;//保存最大平台值
68     int s = 0;//临时变量
69 
70     for (i = 0; i < n; i++)
71     {
72         s = 0;
73 
74         for (j = i; j < n; j++)
75         {
76             if (arr[i] == arr[j])
77             {
78                 s++;
79             }
80 
81             if (s > max)
82             {
83                 max = s;
84             }
85         }
86     }
87 
88     return max;
89 }

20 某桔农家共有2520只桔子, 父亲要将它们分给六个儿子,其分法如下:父亲先将2520只桔子分给六个儿子, 然后说:“老大,把你分到的桔子的八分之一给老二;老二拿到以后,连同原来的桔子分出七分之一给老三;老三拿到以后,连同原来的桔子分出六分之一给老四;老四拿到以后,连同原来的桔子分出五分之一给老五;老五拿到以后,连同原来的桔子分出四分之一给老六;老六拿到以后,连同原来的桔子分出三分之一给老大”。这样分完之后,六个儿子手里的桔子正好一样多。问六个儿子原先分到的桔子各是多少只?

 1 #include <stdio.h>
 2 #define N 6
 3 
 4 void main()
 5 {
 6     const int total = 2520;//共有2520只桔子
 7     int arr[N] = { 0 };//初始化数组
 8     int i;//数组下标
 9 
10     for (i = 0; i < N; i++)//最终结果每人一样
11     {
12         arr[i] = total / N;
13     }
14 
15     arr[0] = arr[0] - arr[5] / 2;//老大接受老六的馈赠后便等于2520/6,故初始化老大的送完老二后的值
16 
17     for (i = 5; i > 0; i--)
18     {
19         arr[i] = arr[i] + arr[i] / (7 - i) - arr[i] / (8 - i);
20     }
21 
22     arr[0] = arr[0] + arr[0] / 7;///加上开始送给老二的桔子
23 
24     for (i = 0; i < N; i++)//打印
25     {
26         printf("第%d个人原先分到的桔子是%d只
", i + 1, arr[i]);
27     }
28 }

21 间隔元素排序。用随机函数产生25个[25,75]之间的整数, 把它送到一维数组M中。要求对M[I],M[I+J],M[I+2*J],…这些元素按从小到大的顺序排序。J的值由键盘输入,I从1到J变化。实际上是以J为间隔排了J个对列,每个对列中从小到大排序。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 #define N 25
 5 
 6 void print(int arr[], int n);//打印数组
 7 void sortJ(int arr[], int n, int j);//间隔元素排序
 8 
 9 void main()
10 {
11     time_t ts;
12     srand((unsigned int)time(&ts));
13     int arr[N] = { 0 };//初始化数组
14     int i;//数组下标
15     int j = 11;//间隔
16 
17     for (i = 0; i < N; i++)
18     {
19         arr[i] = rand() % 100;//赋值
20     }
21 
22     print(arr, N);//打印数组
23 
24     printf("间隔元素排序
");
25 
26     sortJ(arr, N, j);//间隔元素排序
27 
28     print(arr, N);//打印数组
29 }
30 
31 void print(int arr[], int n)//打印数组
32 {
33     int i;//数组下标
34 
35     for (i = 0; i < n; i++)
36     {
37         printf("%5d", arr[i]);
38         if ((i + 1) % 5 == 0)
39         {
40             printf("
");
41         }
42     }
43 }
44 
45 void sortJ(int arr[], int n, int j)//间隔元素排序
46 {
47     int i = 0;//数组下标
48     int p = 0;//数组下标
49     int q = 0;//数组下标
50     int temp = 0;//临时
51 
52     for (i = 0; i < n; i += j)//外循环,间隔
53     {
54         for (p = i; p < i + j - 1 && p < n; p++)//内循环,排序,注意不要越界
55         {
56             for (q = i; q < i + j - 1 && q < n - 1; q++)//内循环,排序,注意不要越界
57             {
58                 if (arr[q] > arr[q + 1])
59                 {
60                     temp = arr[q];
61                     arr[q] = arr[q + 1];
62                     arr[q + 1] = temp;
63                 }
64             }
65         }
66     }
67 }

22 求阶乘N!。

设输入的N最大可使N!达到100位,要求打印出全部有效数字。方法如下:用数组M[100]代表一个100位的数。M[1]代表最高位,M[100] 代表最低位。先对M[100]置1,其余各元素置零,然后从1到N进行累乘。同通常作乘法一样,数组M与I(1≤I≤N)相乘时,从低位数乘起,乘积大于9时进到上一位去,然后将结果打印(从头一个不等于零的位开始)。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 void main()
 5 {
 6     int M[100] = { 0 };//用数组M[100]代表一个100位的数
 7     M[99] = 1;//先对M[99]置1
 8     int i = 1;//1至100阶乘N!
 9     int j = 99;//数组下标
10     int JW = 0;//进位
11     int num = 0;//临时乘积
12 
13     for (i = 1; i < 100; i++)
14     {
15         JW = 0;//进位置为0
16 
17         for (j = 99; j >= 0; j--)
18         {
19             int num = M[j] * i + JW;
20 
21             if (num > 9)//如果大于9,需要进位
22             {
23                 M[j] = num % 10;//保存个位数
24                 JW = num / 10;//进位
25             }
26             else
27             {
28                 M[j] = M[j] * i + JW;
29                 JW = 0;//进位置为0
30             }
31         }
32     }
33 
34     i = 0;
35     while (M[i] == 0)//从头一个不等于零的位开始
36     {
37         i++;
38     }
39         
40     while (i < 100)//打印结果
41     {
42         printf("%d ", M[i]);
43         i++;
44     }
45 }

23 编写“N个人放鞭炮问题的程序”。

N个人同时刻开始放鞭炮, 第一个人每隔T1秒放一次,第二个人每隔T2秒放一次,...第N个人每隔Tn秒放一次。每个人各放M个鞭炮。问总共能听到多少次鞭炮声。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 #define N 5//N个人
 5 #define M 10//每个人各放M个鞭炮
 6 
 7 void main()
 8 {
 9     int arr[N*M] = { 0 };//数组的元素个数是N*M,1代表听到鞭炮声,0代表没有听到鞭炮声
10     int i = 0;//临时变量,用于循环
11     int j = 0;//临时变量,用于循环
12     int k = 0;//临时变量,用于循环
13     int count = 0;//计数器
14     int cnt = 0;//计数器
15 
16     for (i = 0; i < N; i++)//外循环,N个人
17     {
18         count = 0;//计数器
19         j = 0;//每次从0开始听到鞭炮声
20         k++;//每隔k秒放一次
21 
22         while (count < M)//内循环,每个人各放M个鞭炮
23         {
24             arr[j] = 1;//1代表听到鞭炮声,0代表没有听到鞭炮声
25             j += k;//秒数+k
26             count++;//计数器
27         }
28     }
29 
30     for (i = 0; i < N*M; i++)//循环,查找有听到鞭炮声的秒数
31     {
32         if (arr[i])
33         {
34             cnt++;//计数器
35             printf("%d ", i);//打印有听到鞭炮声的秒数
36         }
37     }
38 
39     printf("总共能听到%d次鞭炮声
", cnt);
40 }

24 十个数字组成完全平方数。

把0、1、2、3、4、5、6、7、8、9十个数字分别组成一个一位数,一个二位数,一个三位数和一个四位数,使它们都是完全平方数(其平方根是整数),共有几种方法? 每种方法的结果是什么? (每个数字只允许用一次)。下边就是一种填法:

1 ( 1 )

36 ( 6 )

784 ( 28 )

9025 ( 95 )

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <stdbool.h>
 5 
 6 bool fillarr(int *arr, int num)
 7 {
 8     int temp = 0;//临时变量
 9 
10     if (num)//如果不是0
11     {
12         while (num)
13         {
14             temp = num % 10;//取出个位数
15             if (!arr[temp])//如果该下标没有被占用
16             {
17                 arr[temp] = 1;//占用
18             }
19             else
20             {
21                 return false;
22             }
23             num /= 10;//去掉个位数
24         }
25     }
26     else//如果是0
27     {
28         if (!arr[num])//如果该下标没有被占用
29         {
30             arr[num] = 1;//占用
31         }
32         else
33         {
34             return false;
35         }
36     }
37 
38     return true;
39 }
40 
41 void main()
42 {
43     int count = 0;//计数器
44     int arr[10] = { 0 };//初始化数组,10个数字,10个元素,下标一一对应,1代表已经占用,0代表没有占用
45     int i = 0;
46     int j = 0;
47     int k = 0;
48     int l = 0;
49 
50     for (i = 0; i < 4; i++)//一位数,临界值0*0==0,3*3==9
51     {
52         for (j = 4; j < 10; j++)//两位数,临界值4*4==16,9*9==81
53         {
54             for (k = 10; k < 32; k++)//三位数,临界值10*10==100,31*31==961
55             {
56                 for (l = 32; l < 100; l++)//四位数,临界值32*32==1024,99*99==9801
57                 {
58                     memset(arr, 0, sizeof(arr));//清零
59                     if (fillarr(arr, i*i) && fillarr(arr, j*j) && fillarr(arr, k*k) && fillarr(arr, l*l))//判断
60                     {
61                         count++;//计数器
62                         printf("%d(%d) %d(%d) %d(%d) %d(%d)
", i*i, i, j*j, j, k*k, k, l*l, l);
63                     }
64                 }
65             }
66         }
67     }
68 
69     printf("共有%d种方法
", count);
70 }

------------------------------二维数组

9 对一个二维数组进行转置

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 
 6 main()
 7 {
 8     int a[3][4] = { 1,2,3,4,5,6,7,8,0,1,2,3 };
 9     int i, j;
10     int b[4][3];//存储转置后的数据
11 
12     for (i = 0;i < 3;i++)
13     {
14         for (j = 0;j < 4;j++)
15         {
16             printf("%-5d", a[i][j]);
17         }
18         printf("
");
19     }
20 
21     printf("以下是转置
");
22 
23     for (i = 0;i < 4;i++)
24     {
25         for (j = 0;j < 3;j++)
26         {
27             b[i][j] = a[j][i];
28             printf("%-5d", b[i][j]);
29         }
30         printf("
");
31     }
32 
33     system("pause");
34 }

10 打印杨辉三角形,包括直角三角形和等腰三角形

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 
 6 #define N 10
 7 
 8 main()
 9 {
10     int a[N][N] = { 0 };
11     int i, j;
12 
13     for (i = 0;i < N;i++)
14     {
15         for (j = 0;j <= i;j++)
16         {
17             if (j == 0 || i == j)
18             {
19                 a[i][j] = 1;
20             }
21             else
22             {
23                 a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
24             }
25             printf("%5d", a[i][j]);
26         }
27         printf("
");
28     }
29 
30     printf("输出等腰三角形
");
31 
32 
33     for (i = 0;i < N;i++)
34     {
35         printf("%*d", 30 - i * 2, a[i][0]);//打印第一列,30是随意值,30 - i * 2,2必须是下下行的一半
36         for (j = 1;j <= i;j++)
37         {
38             printf("%4d", a[i][j]);//%4d,4个字符的宽度,必须为上上行的2倍
39         }
40         printf("
");
41     }
42 
43     system("pause");
44 }

11 有一个班,3个学生,各学4门课,计算总平均分以及第n个学生的成绩。查找有一门以上课程不及格的学生,输出该学生的所有成绩

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 
 6 void avg(int(*p)[4], int n)//用指向数组的指针存储二维数组名,传递多少个元素(一维数组)
 7 {
 8     int i, j;
 9     double res = 0;
10 
11     for (i = 0;i < 3;i++)
12     {
13         for (j = 0;j < 4;j++)
14         {
15             res += p[i][j];
16         }
17     }
18 
19     res /= 12;
20     printf("%f
", res);
21 }
22 
23 void show(int(*p)[4], int num)
24 {
25     int i;
26 
27     for (i = 0;i < 4;i++)
28     {
29         printf("%6d", p[num][i]);//打印num行的所有数据
30     }
31 }
32 
33 void fail(int(*p)[4])
34 {
35     int i, j;
36     int flag = 1;//假设及格=1
37 
38     for (i = 0;i < 3;i++)
39     {
40         flag = 1;
41         for (j = 0;j < 4;j++)
42         {
43             if (p[i][j] < 60)
44             {
45                 flag = 0;//检测到不及格就退出循环
46                 break;
47             }
48         }
49         if (flag == 0)//检测到不及格就全部打印
50         {
51             for (j = 0;j < 4;j++)
52             {
53                 printf("%5d", p[i][j]);
54             }
55             printf("
");
56         }
57     }
58 }
59 
60 main()
61 {
62     int a[3][4] = { {45,68,97,68},{89,67,65,99},{100,89,98,86} };
63     int num;
64     avg(a, 3);
65 
66     //scanf("%d", &num);
67     //show(a, num);
68 
69     fail(a);
70 
71     system("pause");
72 }

12 打印如下形式的杨辉三角形

              1

              1   1

              1   2   1

              1   3   3   1

              1   4   6   4   1

              1   5   10  10  5   1

输出前10行,从 0行开始,分别用一维数组和二维数组实现

二维数组

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 
 6 #define N 10
 7 
 8 void main()
 9 {
10     int arr[N][N] = { 0 };//初始化数组
11     int i;
12     int j;
13 
14     for (i = 0; i < N; i++)
15     {
16         for (j = 0; j <= i; j++)//对角线左下
17         {
18             if (j == 0 || i == j)
19             {
20                 arr[i][j] = 1;//如果是每行第0列或者是对角线上,为1
21             }
22             else
23             {
24                 arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];//其他为上一行上一列arr[i - 1][j - 1]和上一行本列arr[i - 1][j]之和
25             }
26             printf("%6d", arr[i][j]);
27         }
28         printf("
");
29     }
30 
31     system("pause");
32 }

13 把一个二维实型数组a按照第0列的元素进行排序(由小到大排序,用起泡法)。例如:如果a[i][0]大于a[i+1][0],则i行与i+1行中所有元素都要进行对换

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 #include <time.h>
 6 
 7 #define N 10
 8 
 9 void zhizhen_myswap(int(*arr)[N], int n, int num1, int num2)//交换两行,第一个参数,数组名,第二个参数,列数,第三、四个参数,交换的两行。使用指针
10 {
11     int i;
12     int temp;
13 
14     for (i = 0; i < n; i++)
15     {
16         temp = *(*(arr + num1) + i);
17         *(*(arr + num1) + i) = *(*(arr + num2) + i);
18         *(*(arr + num2) + i) = temp;
19     }
20 }
21 
22 void xiabiao_myswap(int arr[][N], int n, int num1, int num2)//交换两行,第一个参数,数组名,第二个参数,列数,第三、四个参数,交换的两行。使用数组下标
23 {
24     int i;
25 
26     for (i = 0; i < n; i++)
27     {
28         arr[num1][i] ^= arr[num2][i];
29         arr[num2][i] ^= arr[num1][i];
30         arr[num1][i] ^= arr[num2][i];
31     }
32 }
33 
34 main()
35 {
36     int i;
37     int j;
38     int arr[N][N] = { 0 };//初始化二维数组
39     time_t ts;
40     srand((unsigned int)time(&ts));
41 
42     for (i = 0; i < N; i++)
43     {
44         for (j = 0; j < N; j++)
45         {
46             arr[i][j] = rand() % 100;
47             printf("%6d", arr[i][j]);
48         }
49         printf("
");
50     }
51 
52     for (i = 0; i < N - 1; i++)
53     {
54         for (j = 0; j < N - 1 - i; j++)
55         {
56             if (arr[j][0]>arr[j + 1][0])
57             {
58                 //xiabiao_myswap(arr, 10, j, j + 1);//交换两行,第一个参数,数组名,第二个参数,列数,第三、四个参数,交换的两行。使用数组下标
59                 zhizhen_myswap(arr, 10, j, j + 1);//交换两行,第一个参数,数组名,第二个参数,列数,第三、四个参数,交换的两行。使用指针
60             }
61         }
62     }
63 
64     printf("after
");
65 
66     for (i = 0; i < N; i++)
67     {
68         for (j = 0; j < N; j++)
69         {
70             printf("%6d", arr[i][j]);
71         }
72         printf("
");
73     }
74 
75 
76     system("pause");
77 }

14 编程产生如下形式的方阵。

              1  2  2  2  2  2  1

              3  1  2  2  2  1  4

              3  3  1  2  1  4  4

              3  3  3  1  4  4  4

              3  3  1  5  1  4  4

              3  1  5  5  5  1  4

              1  5  5  5  5  5  1

        要求:不允许使用键盘输入语句和静态赋值语句,尽量少用循环。

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 
 6 #define N 7
 7 
 8 main()
 9 {
10     int a[N][N] = { 0 };//初始化数组
11     int i;
12     int j;
13 
14     for (i = 0; i < N; i++)
15     {
16         for (j = 0; j < N; j++)
17         {
18             if (i == j || i + j == 6)//两条对角线为1
19             {
20                 a[i][j] = 1;
21             }
22             else if (i < j && i + j < 6)//上边为2
23             {
24                 a[i][j] = 2;
25             }
26             else if (i > j && i + j < 6)//左边为3
27             {
28                 a[i][j] = 3;
29             }
30             else if (i < j && i + j > 6)//右边为4
31             {
32                 a[i][j] = 4;
33             }
34             else//其他,即是下边为5
35             {
36                 a[i][j] = 5;
37             }
38             printf("%2d", a[i][j]);
39         }
40         printf("
");
41     }
42 
43     system("pause");
44 }

15 找出 M×N 数组中所有不相邻元素,并求出它们的和(相邻的数:前一个是偶数,后一个是素数)。

  1 #define _CRT_SECURE_NO_WARNINGS
  2 
  3 #include <stdio.h>
  4 #include <stdlib.h>
  5 #include <math.h>
  6 #include <time.h>
  7 
  8 #define M 10
  9 #define N 10
 10 
 11 int jiou(int num)//1是奇数,0是偶数
 12 {
 13     return num % 2;
 14 }
 15 
 16 int isprime(int num)//1是素数,0不是素数
 17 {
 18     int flag = 1;
 19     int i;
 20 
 21     if (num < 2)
 22     {
 23         flag = 0;
 24     }
 25     else if (num == 2)
 26     {
 27         flag = 1;
 28     }
 29     else
 30     {
 31         for (i = 2; i <= sqrt(num); i++)
 32         {
 33             if (!(num%i))
 34             {
 35                 flag = 0;
 36                 break;
 37             }
 38         }
 39     }
 40 
 41     return flag;
 42 }
 43 
 44 void main()
 45 {
 46     time_t ts;
 47     srand((unsigned int)time(&ts));
 48     int arr[M][N] = { 0 };//初始化数组
 49     int i;//数组下标
 50     int j;//数组下标
 51     int flag = 0;//1是符合,0不符合
 52     int sum = 0;//
 53 
 54     for (i = 0; i < M; i++)
 55     {
 56         for (j = 0; j < N; j++)
 57         {
 58             arr[i][j] = rand() % 100;//随机赋值
 59             printf("%5d", arr[i][j]);//打印
 60         }
 61         printf("
");
 62     }
 63 
 64     int *p = &arr[0][0];//指针,指向第一个元素的地址
 65 
 66     if (!jiou(*(p)) && isprime(*(p + 1)))//判断第一个元素,如果第一个元素是偶数,第二个元素是素数
 67     {
 68         sum += *(p);
 69         printf("0,%d
", *(p));
 70     }
 71 
 72     for (i = 1; i < M*N - 1; i++)//从第二个元素开始循环,直到倒数第二个元素
 73     {
 74         flag = 0;//默认不符合
 75 
 76         if (!jiou(*(p + i - 1)) && isprime(*(p + i)))//如果前一个是偶数,它本是素数
 77         {
 78             flag = 1;
 79         }
 80         else if (!jiou(*(p + i)) && isprime(*(p + i + 1)))//如果它本是偶数,后一个是素数
 81         {
 82             flag = 1;
 83         }
 84 
 85         if (flag == 1)
 86         {
 87             sum += *(p + i);
 88             printf("%d,%d
", i, *(p + i));
 89         }
 90     }
 91 
 92     if (!jiou(*(p + M*N - 2)) && isprime(*(p + M*N - 1)))//判断最后一个元素,如果倒数第二个元素是偶数,最后一个元素是素数
 93     {
 94         sum += *(p + M*N - 1);
 95         printf("%d,%d
", i, *(p + M*N - 1));
 96     }
 97 
 98     printf("sum=%d
", sum);
 99 
100     system("pause");
101 }

16 打印魔方阵。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如:三阶魔方阵为

                        8  1  6

                        3  5  7

                        4  9  2

    要求打印由 1到的自然数构成的魔方阵。

    提示:魔方阵中各数的排列规律如下:

      ⑴  将“1”放在第一行中间一列;

      ⑵  从“2”开始直到n×n为止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1;

      ⑶  如果上一个数的行数为1,则下一个数的行数为 n(指最下一行);

      ⑷  当一个数的列数为 n,下一个数的列数应为1,行数减1;

      ⑸  如果按上面规则确定的位置已有数,或上一个数是第 1行第 n列时, 则把下一个数放在上一个数的下面。

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 
 6 #define N 3//N可以为任何奇数,因为偶数矩阵没有对角线,故不符合题意
 7 
 8 void main() 
 9 {
10     int a[N][N] = { 0 };//初始化数组
11     int num = 1;//⑴  将“1”放在第一行中间一列;
12 
13     int i = 0;//⑴  将“1”放在第一行中间一列;
14     int j = N / 2;//⑴  将“1”放在第一行中间一列;
15 
16     int ci = 0;
17     int cj = 0;
18 
19     for (num = 1; num <= N*N; num++)
20     {
21         a[i][j] = num;//保存数字
22         ci = i;//保存上一个数字的位置
23         cj = j;//保存上一个数字的位置
24         
25         i = ci - 1;//⑵  从“2”开始直到n×n为止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1;
26         j = cj + 1;
27 
28         if (ci == 0)//⑶  如果上一个数的行数为1,则下一个数的行数为 n(指最下一行);
29         {
30             i = N - 1;
31         }
32 
33         if (cj == N - 1)//⑷  当一个数的列数为 n,下一个数的列数应为1,行数减1;
34         {
35             j = 0;
36             i = ci - 1;
37         }
38 
39         if (a[i][j] != 0 || ci == 0 && cj == N - 1)//⑸  如果按上面规则确定的位置已有数,或上一个数是第 1行第 n列时, 则把下一个数放在上一个数的下面。
40         {
41             i = ci + 1;
42             j = cj;
43         }
44     }
45 
46     for (i = 0; i < N; i++)//打印数组
47     {
48         for (j = 0; j < N; j++)
49         {
50             printf("%5d", a[i][j]);
51         }
52         printf("
");
53     }
54 
55     system("pause");
56 }

17 找规律,编程序打印6×6的矩阵:

   1   2   3   5   8   13

   1   4   9  17  30   51

   1   6  19  45  92  173

       . . .

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 
 4 #define N 6
 5 
 6 void main()
 7 {
 8     int arr[N][N] = { 0 };
 9     int i;
10     int j;
11 
12     for (i = 0; i < N; i++)
13     {
14         for (j = 0; j < N; j++)
15         {
16             if (j == 0)//第0列是1
17             {
18                 arr[i][j] = 1;
19                 printf("%5d", arr[i][j]);
20             }
21             else if (i == 0)//第0行
22             {
23                 if (j == 1)//第0行第1列是2
24                 {
25                     arr[i][j] = 2;
26                 }
27                 else//第0行是从第2列开始前2列之和
28                 {
29                     arr[i][j] = arr[i][j - 1] + arr[i][j - 2];
30                 }
31                 printf("%5d", arr[i][j]);
32             }
33             else
34             {
35                 arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j] + arr[i][j - 1];//其他是左上方,上方,左方之和
36                 printf("%5d", arr[i][j]);
37             }
38         }
39         printf("
");
40     }
41 }

18 已知M1是3×5的矩阵, M2是5×2的矩阵, 编程序求出M1与M2之积。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 
 5 void main()
 6 {
 7     time_t ts;
 8     srand((unsigned int)time(&ts));
 9     int M1[3][5] = { 0 };
10     int M2[5][2] = { 0 };
11     int M3[3][2] = { 0 };
12     int i;
13     int j;
14     int k;
15     int sum = 0;
16 
17     for (i = 0; i < 3; i++)//数组M1赋值
18     {
19         for (j = 0; j < 5; j++)
20         {
21             M1[i][j] = rand() % 2;
22             printf("%5d", M1[i][j]);
23         }
24         printf("
");
25     }
26 
27     printf("

");
28 
29     for (i = 0; i < 5; i++)//数组M2赋值
30     {
31         for (j = 0; j < 2; j++)
32         {
33             M2[i][j] = rand() % 2;
34             printf("%5d", M2[i][j]);
35         }
36         printf("
");
37     }
38 
39     printf("

");
40 
41     for (i = 0; i < 3; i++)//计算数组M3
42     {
43         for (j = 0; j < 2; j++)
44         {
45             sum = 0;
46             for (k = 0; k < 5; k++)
47             {
48                 sum += M1[i][k] * M2[k][j];
49             }
50             M3[i][j] = sum;
51         }
52     }
53 
54     for (i = 0; i < 3; i++)//打印
55     {
56         for (j = 0; j < 2; j++)
57         {
58             printf("%5d", M3[i][j]);
59         }
60         printf("
");
61     }
62 
63     system("pause");
64 }

19 找规律填写N×N方阵。如N=8时, 其方阵为:

1  1  1  1  1  1  1  1

1  2  2  2  2  2  2  1

1  2  3  3  3  3  2  1

1  2  3  4  4  3  2  1

1  2  3  4  4  3  2  1

1  2  3  3  3  3  2  1

1  2  2  2  2  2  2  1

1  1  1  1  1  1  1  1

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 #define N 8
 5 
 6 void main()
 7 {
 8     int a[N][N] = { 0 };
 9 
10     int i;
11     int j;
12     int k;
13     int u;
14     int v;
15     int data = 1;
16 
17     for (i = 0, j = 0, k = 0; k < (N + 1) / 2; k++, data++)
18     {
19         while (i < N - k)//左列赋值
20         {
21             a[i][j] = data;
22             i = i + 1;
23         }
24         i--;
25         j++;
26 
27         while (j < N - k)//下行赋值
28         {
29             a[i][j] = data;
30             j = j + 1;
31         }
32         j--;
33         i--;
34 
35         while (i > k - 1)//右列赋值
36         {
37             a[i][j] = data;
38             i = i - 1;
39         }
40         i++;
41         j--;
42 
43         while (j > k)//上行赋值
44         {
45             a[i][j] = data;
46             j = j - 1;
47         }
48         i++;
49         j++;
50     }
51 
52     for (u = 0; u < N; u++)//打印
53     {
54 
55         for (v = 0; v < N; v++)
56         {
57             printf("%d	", a[u][v]);
58 
59         }
60         printf("
");
61     }
62 
63     system("pause");
64 }

20 求N阶方阵(即N×N数组)中各条反斜线上的元素之和。如4×4数组共有7条反斜线:

image

注:求和时,请按斜线编号顺序显示求出的和。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 
 5 #define N 4
 6 
 7 void main()
 8 {
 9     time_t ts;
10     srand((unsigned int)time(&ts));
11     int arr[N][N] = { 0 };//初始化数组
12     int arrSum[2 * N - 1] = { 0 };//初始化数组,存储各条反斜线上的元素之和
13     int i;//数组下标
14     int j;;//数组下标
15     int sum = 0;//临时变量,存储反斜线上的元素之和
16     int m;//数组下标
17     int n;//数组下标
18     int count = 0;//存储各条反斜线上的编号
19 
20     for (int i = 0; i < N; i++)//随机赋值
21     {
22         for (int j = 0; j < N; j++)
23         {
24             arr[i][j] = rand() % 10;
25             printf("%5d", arr[i][j]);
26 
27         }
28         printf("
");
29     }
30 
31     for (i = N - 1, j = 0, count = 0; i >= j; j++, count++)//从左下方第N-1行第0列开始循环到对角线第N-1行第N-1列
32     {
33         sum = 0;//临时变量,存储反斜线上的元素之和
34         m = i;
35         n = j;
36 
37         while (m >= 0 && n >= 0)//数组下标一定大于等于0
38         {
39             sum += arr[m][n];
40             m--;//向上-1
41             n--;//向上-1
42         }
43 
44         arrSum[count] = sum;//记录反斜线上的元素之和
45 
46         printf("arrSum[%d]=%d
", count, sum);
47     }
48 
49     for (i = N - 2, j = N - 1; i >= 0; i--, count++)//从对角线上方第N-2行第N-1列开始循环到第0行第N-1列
50     {
51         sum = 0;//临时变量,存储反斜线上的元素之和
52         m = i;
53         n = j;
54 
55         while (m >= 0 && n >= 0)//数组下标一定大于等于0
56         {
57             sum += arr[m][n];
58             m--;//向上-1
59             n--;//向上-1
60         }
61 
62         arrSum[count] = sum;//记录反斜线上的元素之和
63 
64         printf("arrSum[%d]=%d
", count, sum);
65     }
66 
67     system("pause");
68 }

21 编写程序,按照 1,2, ... , 28的顺序填一个7×7数组的左上角,程序的输出结果为:

    1    2    4    7   11   16   22

    3    5    8   12   17   23

    6    9   13   18   24

   10   14   19   25

   15   20   26

   21   27

   28

 1 #include <stdio.h>
 2 #define N 7
 3 
 4 void main()
 5 {
 6     int arr[N][N] = { 0 };
 7     int i, j;//数组下标
 8     int m = 0;//开始,第0行
 9     int n = 0;//开始,第0列
10     int count = 0;//每循环一次斜线,+1
11 
12     for (i = 1; i <= (N + 1)*N / 2; i++)//对角线左上角,含对角线
13     {
14         arr[m][n] = i;//赋值
15 
16         if (n == 0)//每次循环到第0列,需要重置,横坐标为0,纵坐标+1
17         {
18             m = 0;//横坐标
19 
20             count++;//纵坐标
21             n = count;
22         }
23         else
24         {
25             m++;
26             n--;
27         }
28     }
29 
30     m = 1;//开始,第1行
31     n = N - 1;//开始,第N-1列
32     count = 1;//每过一次斜线,+1
33 
34     for (i = (N + 1)*N / 2 + 1; i <= N*N; i++)//对角线右下角,不含对角线
35     {
36         arr[m][n] = i;//赋值
37 
38         if (m == N - 1)//每次循环到第N-1行,需要重置,横坐标为+1,纵坐标为N-1
39         {
40             count++;//横坐标
41             m = count;
42 
43             n = N - 1;////纵坐标
44         }
45         else
46         {
47             m++;
48             n--;
49         }
50     }
51 
52     for (i = 0; i < N; i++)//打印
53     {
54         for (j = 0; j < N; j++)
55         {
56             printf("%5d", arr[i][j]);
57         }
58         printf("
");
59     }
60 }

22 二维数组排序。设有4×5的数组M,通过排序使M[1][1]≤M[1][2]≤...≤M[1][5]≤M[2][1]≤M[2][2]≤...≤M[2][5]≤...≤M[4][1]≤M[4][2]≤...≤M[4][5]。排序时不允许引入其它数组。

 1 #include <stdio.h>
 2 #include <time.h>
 3 
 4 #define N 4
 5 #define M 5
 6 
 7 void sort(int *p, int n, int m)//二维数组排序,冒泡
 8 {
 9     int i, j;//数组下标
10     int temp;
11 
12     for (i = 0; i < n*m - 1; i++)//冒泡
13     {
14         for (j = 0; j < n*m - 1 - i; j++)
15         {
16             if (*(p + j)>*(p + j + 1))
17             {
18                 temp = *(p + j);
19                 *(p + j) = *(p + j + 1);
20                 *(p + j + 1) = temp;
21             }
22         }
23     }
24 }
25 
26 void print(int arr[][M], int n, int m)//打印二维数组
27 {
28     int i, j;
29 
30     for (i = 0; i < n; i++)
31     {
32         for (j = 0; j < m; j++)
33         {
34             printf("%5d", arr[i][j]);
35         }
36         printf("
");
37     }
38 }
39 
40 void main()
41 {
42     time_t ts;
43     srand((unsigned int)time(&ts));
44     int arr[N][M] = { 0 };//初始化数组
45     int i, j;//数组下标
46 
47     for (i = 0; i < N; i++)
48     {
49         for (j = 0; j < M; j++)
50         {
51             arr[i][j] = rand() % 100;//数组赋值
52         }
53     }
54 
55     print(arr, N, M);//打印二维数组
56 
57     printf("二维数组排序,冒泡
");
58 
59     sort(arr, N, M);//二维数组排序,冒泡
60 
61     print(arr, N, M);//打印二维数组
62 }

123

原文地址:https://www.cnblogs.com/denggelin/p/5491364.html