经典算法_数组

摘要:
主函数中打印的最小十进制数6不会改变原始的一维数组排序。指针数组用于排序。气泡排序方法7.一维数组的反转8.N个数字按从小到大的顺序排列。要求输入一个数字,将其插入原始序列,并保持顺序9。使用选择方法将10个整数从大到小排序10。使用过滤方法查找2到100之间的素数。15依次交换一维数组中的偶数。十个数字组成一个完美的正方形。

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, intlen)
4 {
5     inti, 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     inti;
16     int max;//用于保存最大值
17     int maxi;//用于保存最大值的下标
18     intmin;
19     intmini;
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[], intn)
 7 {
 8     inti;
 9     inttemp;
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     inti;
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, intn)
 7 {
 8     inti, j;
 9     inttemp;
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     inti;
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     inti;
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     returnp;
28 }
29 
30 main()
31 {
32 time_t ts;
33     srand((unsigned int)time(&ts));
34     
35     int a[10];
36     inti;
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     inti, 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[], intn)
7 {
8     inti;
9     inttemp;
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     inti;
22     inttemp;
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     inti;
35     inttemp;
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[], intn)
46 {
47     inti;
48     inttemp;
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     inti;
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     inti;
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     inti;
22     intj;
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     inti;
9     intj;
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     inti;
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 voidmain()
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(intnum)
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(intnum)
19 {
20     inti;
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     returnflag;
41 }
42 
43 voidmain()
44 {
45     inti;
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     inti;
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 voidmain()
39 {
40 time_t ts;
41     srand((unsigned int)time(&ts));
42     inti;
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 voidmain()
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     inti;
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     returnpFirst;
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     returnpLast;
31 }
32 
33 voidmain()
34 {
35     int arr[N] = { 2,3,1,6,8,7,9,5 };//初始化数组
36     inti;
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[], intn)
7 {
8     inti;
9 
10     for (i = 0; i < n; i++)
11 {
12         printf("%5d", arr[i]);
13 }
14     printf("");
15 }
16 
17 voidmain()
18 {
19     int arr[N] = { 1,2,3,4,5,6,7,8};
20     int k = 3;
21     inti;
22     int temp = 0;
23     intj;
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     inti;
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 voidmain()
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     inti;
10     intj;
11     inttemp;
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 voidmain()
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 voidmain()
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     returnflag;
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     returnflag;
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     returnmax;
89 }

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

1 #include <stdio.h>
2 #define N 6
3 
4 voidmain()
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 voidmain()
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 voidmain()
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 voidmain()
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, intnum)
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 voidmain()
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     inti, 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     inti, 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     inti, 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], intnum)
24 {
25     inti;
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     inti, 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     intnum;
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 voidmain()
9 {
10     int arr[N][N] = { 0 };//初始化数组
11     inti;
12     intj;
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     inti;
12     inttemp;
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     inti;
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     inti;
37     intj;
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     inti;
12     intj;
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     inti;
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     returnflag;
42 }
43 
44 voidmain()
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 voidmain() 
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 voidmain()
7 {
8     int arr[N][N] = { 0};
9     inti;
10     intj;
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 voidmain()
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     inti;
13     intj;
14     intk;
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 voidmain()
7 {
8     int a[N][N] = { 0};
9 
10     inti;
11     intj;
12     intk;
13     intu;
14     intv;
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 voidmain()
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 voidmain()
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     inttemp;
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     inti, 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 voidmain()
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

免责声明:文章转载自《经典算法_数组》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇微信小程序-返回并更新上一页面的数据C#:在AnyCPU模式下使用CefSharp下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

第四章:文件stat获取函数

所在的头文件 <sys/stat.h> struct  stat{ mode_t  st_mode; /*文件的访问模式*/ ino_t   st_ino;  /*i节点的信息*/ dev_t   st_dev;  /*设备号*/ dev_t   st_rdev;  /*特殊文件的设备号*/ nlink_t  st_nlink;  /*硬链接接...

Shell学习(五)Shell输出命令

一、echo命令 #1、直接显示字符串 echo "It is a test" #输出:It is a test #2、显示转义字符 echo ""It is a test"" #输出:"It is a test" #3、显示变量 name=Shell echo "$name It is a test" #输出:Shell is a test #4、...

Python web前端 06 运算符 循环

Python web前端 06 运算符 循环 一、运算符 #JS六大数据类型 #number 数字 #string 字符串 #boolean 布尔型 #function 函数 #undefined 未定义:一个变量声明之后没有复制就是未定义 #object 对象 在JS里面null属于对象类型,但是它不具有很多对象的共性,所以很多资料将他归为单...

FFT题集

FFT学习参考这两篇博客,很详细,结合这看,互补。 博客一 博客二 很大一部分题目需要构造多项式相乘来进行计数问题。 1.HDU 1402 A * B Problem Plus把A和B分别当作多项式的系数。 #include <cstdio>#include <algorithm>#include <cmath>#in...

c语言获取linux的CPU、内存、IO、磁盘、网速(本机编译通过)

代码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define MAXBUFSIZE 1024 #define WAIT...

[置顶] VC++ 创建Windows服务

首先,附上Windows创建服务的源代码,这个很好用的,大家一般都是选择的这个使用。 #include"XXXX.h" //包含的头文件 //定义全局函数变量 void Init(); BOOL IsInstalled(); BOOL Install(); BOOL Uninstall(); void LogEvent(LPCTSTR pszForma...