zoukankan      html  css  js  c++  java
  • 经典算法_数组

    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

  • 相关阅读:
    osds have slow requests
    supervisor 管理 celery
    guacamole部署
    openstack IPV6
    修复VSAN无法看到主机磁盘
    kolla之docker私有仓库创建
    CSS日食与太阳碰撞
    vue-devtools必备工具
    VUE在BODY上绑定enter事件
    VUE输入框显示时自动聚焦
  • 原文地址:https://www.cnblogs.com/denggelin/p/5491364.html
Copyright © 2011-2022 走看看