数组 例题解析

例题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");
}
原文地址:https://www.cnblogs.com/Yang-Xin-Yi/p/13520082.html