• 数组 例题解析


    例题1.求矩阵的马鞍点。马鞍点即矩阵元素所在行的最大值,以及所在列的最小值。

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #define M 100
    #define N 100
    void main()
    {
        int i, j, k, m, n, flag;
        int a[M][N], max;
        printf("输入行数 m:");    scanf("%d", &m);
        printf("
    输入列数 n:");    scanf("%d", &n);
    
        srand((unsigned)time(NULL));
        for (i = 0; i < m; i++)
            for (j = 0; j < n; j++)
                a[i][j] = rand() % 100;
        for (i = 0; i < m; i++)
        {
            for (j = 0; j < n; j++)
                printf("%5d", a[i][j]);
            printf("
    ");
        }
    
        for (i = 0; i < m; i++)
        {
            max = a[i][0];
            for (j = 1; j < n; j++)
                if (a[i][j] > max)  max = a[i][j]; //找出行中的最大值
            for (j = 0; j < n; j++)
            {
                flag = 0;
                if (a[i][j] == max)//定位到当前行最大值的列
                {
                    for (k = 0, flag = 1; k < m && flag; k++)
                        if (a[k][j] < max) flag = 0;break;//只要max大于当前列中某值,剩余值即可不做比较。
                    if (flag)
                    {
                        printf("第%d行, 第%d列的 %d是鞍点
    ", i, j, a[i][j]);
                        flag = 1;
                    }
                }
            }
        }
        if (!flag)
            printf("
    矩阵中无鞍点!
    ");
    
        system("pause");
    }

    例题2.有 N个数已按由小到大的顺序排好,要求输入一个数, 把它插入到原有序列中,而且仍然保持有序。//元素后移

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    
    void main()
    {
        int arr[11] = { 1,2,3,4,5,7,8,9,10,11 };
        int num = 6;
        for (int i = 0; i<10; i++)
            if (arr[i]>num)
            {
                for (int j = 10; j > i; j--)
                    arr[j] = arr[j - 1];
                arr[i] = num;
                break;
            }
    
        system("pause");
    }

    例题3.用选择法对10个整数由大到小排序。交换两个值 不用临时变量 a = a^b ; b = b^a; a = a^b

    void SortSelect(int * arr, int num)
    {
        int i, j, max;
        for (i = 0; i<num - 1; i++)
        {
            max = i;
            for (j = i + 1; j<num; j++)
                if (arr[j]>arr[max])    max = j;
    
            if (i != max)
            {
                arr[max] ^= arr[i];
                arr[i] ^= arr[max];
                arr[max] ^= arr[i];
            }
        }
    }

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

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    void main()
    {
        int num = 100;
        int arr[100];
        for (int i = 0; i < num; i++) arr[i] = i + 1;
    
        for (int i = 1; i < num; i++)
            for (int j = i + 1; j < num; j++)//j+1作为被除数
            {
                if (arr[j] % (i + 1) == 0) arr[j] = 0;//非素数置零
            }
    
        for (int i = 1, n = 0; i < num; i++)
            if (arr[i] != 0)
            {
                printf("%d  ", arr[i]);
                if (++n % 10 == 0) printf("
    ");//十个一组输出
            }
    
        system("pause");
    }

    例题5.求一个 3×3矩阵两条对角线上元素之和(每个元素只加一次)。

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    
    void main()
    {
        int arr[3][3] = { 0 };
        for (int i = 0; i<3; i++)
            for (int j = 0; j<3; j++)
            {
                arr[i][j] = rand() % 10;
            }
        int sum = 0;
    
        for (int i = 0; i<3; i++)
            for (int j = 0; j<3; j++)
                if (i == j || i + j == 2)
                {
                    sum += arr[i][j];
                }
    
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                printf("%5d", arr[i][j]);
            }
            printf("
    ");
        }
        printf("对角线之和为%d
    ", sum);
    system(
    "pause"); }

    例题6.打印杨辉三角形 

    #include<stdio.h>
    #include<stdlib.h>
    
    void main()
    {
        int arr[10][10] = { 0 };
        for (int i = 0; i<10; i++)
        {
            for (int j = 0; j <= i; j++)  //第n行的数字有n项 
            {
                if (j == 0 || i == j)
                    arr[i][j] = 1;
                else
                    arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];  //每个数等于它上方两数之和
                printf("%6d", arr[i][j]);
            }
            printf("
    ");
        }
    
        system("pause");
    }
    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    
    void printYanghui(int line)    //用一维数组打印
    { 
        int i, j;
        int *data = (int *)malloc(line * sizeof(int));//动态创建数组  
    
        if (line == 1)//只打印一行  
        {
            printf("1
    ");
        }
        else if (line == 2)//只打印2行  
        {
            printf("1
    1	1
    ");
        }
        else//打印三行以上  
        {
            data[0] = 1;
            data[1] = 1;
            data[2] = 1;
            printf("1
    1	1
    ");
            for (i = 3; i<line + 1; i++)//第i行的数字个数为i  
            {
                data[i - 1] = 1;
                for (j = i - 2; j>0; j--)//按照从倒数第二个数字开始重新计算data数组。否则从前面开始会覆盖掉前面的值  
                {
                    data[j] = data[j - 1] + data[j];
                }
                data[0] = 1;
                for (j = 0; j<i; j++)
                {
                    printf("%d	", data[j]);
                }
                printf("
    ");
            }
        }
    }
    
    int main( )
    {
        int line = 0;
        printf("请输入行数N:");
        scanf("%d", &line);
        printYanghui(line);
    
        system("pause");
    }

    例题7.将字符数组 A中下标为双号(0,2,4,6,8...) 的元素值传给另一个字符数组 B,然后将 B数组的元素按逆序输出。

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    void main()
    {
        char *p = "abcdefgh";
        char To[20];
        unsigned i = 0, j = 0;
        while (i < strlen(p))
        {
            To[j++] = *(p + i);
            i += 2;
        }
        To[j] = '';
    
        while (j > 0)
        {
            printf("%2c", To[j - 1]);
            j--;
        }
    
        system("pause");
    }

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

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    void main()
    {
        int total = 17, need = 17, k = 3;
        int index = 0, count = 0, i = 0;
        int a[100] = { 0 };
        for (;;)
        {
            index = index % total + 1;
            if (a[index] == 0)
            {
                i = (i + 1) % k;
                if (i == 0)
                {
                    count++;
                    a[index] = 1;
                }
            }
            if (count == need) break;
        }
        printf("index = %d
    ", index);
        system("pause");
    }
  • 相关阅读:
    C# 参数按照ASCII码从小到大排序(字典序)
    .net平台下C#socket通信 (下)
    net平台下C#socket通信(上)
    使用C#创建Windows服务
    C# EF 批量操作
    消息队列及常见消息队列介绍
    消息队列的4种应用场景
    npm install 安装到指定的目录
    express学习1
    nodejs url
  • 原文地址:https://www.cnblogs.com/Yang-Xin-Yi/p/13520082.html
Copyright © 2020-2023  润新知