一维数组和二维数组

第1关:排序问题
任务描述
本关任务:将十个数进行从大到小的顺序进行排列。

输入
输入十个整数。

输出
以从大到小的顺序输出这个十个数。

测试说明
样例输入:
1 2 3 4 5 6 7 8 9 10

样例输出:
10 9 8 7 6 5 4 3 2 1

解题说明:
功能封装到函数,实现程序复用。
解题程序:

#include<stdio.h>

#define N 10
int a[N];

/* 从大到小的冒泡排序 */
void bubbleSort(int numbers[], int array_size)
{
  int i, j, temp;

  for (i = (array_size - 1); i > 0; i--)
    for (j = 1; j <= i; j++)
      if (numbers[j-1] < numbers[j]) {
        temp = numbers[j - 1];
        numbers[j - 1] = numbers[j];
        numbers[j] = temp;
      }
}

int main(void)
{
    /*********Begin*********/
    int i, j;

    for(i = 0; i < N; i++)
        scanf("%d", &a[i]);
    
    /* 冒泡排序 */
    bubbleSort(a, N);

    for(i = 0; i < N; i++)
        printf("%d ", a[i]);
    printf("\n");
    /*********End**********/
    return 0;
}

第2关:查找整数
任务描述
题目描述:给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。

输入
第一行包含一个整数n。
第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。
第三行包含一个整数a,为待查找的数。
输出
如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。

测试说明
样例输入:
6
1 9 4 8 3 9
9
样例输出:
2

数据规模与约定:
1 <= n <= 1000

解题程序:

/* 第2关:查找整数 */

#include<stdio.h>

#define N 1000
int a[N];

int main(void)
{
    /*********Begin*********/
    int n, x, i;

    /* 读入数据 */
    scanf("%d", &n);
    for(i = 0; i < n; i++)
        scanf("%d", &a[i]);
    scanf("%d", &x);
    
    /* 查找数据 */
    for(i = 0; i < n; i++)
        if(a[i] == x) break;

    printf("%d\n", i == n ? -1 : i + 1);    
    /*********End**********/
    return 0;
}

第3关:计算数组中元素的最大值及其所在的行列下标值
任务描述
题目描述:按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中m和n的值由用户键盘输入。已知m和n的值都不超过10。

输入
输入数组大小:“%d,%d”
下面输入数组中元素。

输出
输出格式
数组大小输入提示信息:“Input m, n:”
数组元素输入提示信息:"Input %d*%d array: "
输出格式:“max=%d, row=%d, col=%d”

样例输入
5,5
1 2 3 4 5
4 5 6 100 2
3 2 1 5 6
1 2 3 5 4
3 5 6 4 8

样例输出
Input m, n:Input 5*5 array:
max=100, row=2, col=4

解题程序:

/* 第3关:计算数组中元素的最大值及其所在的行列下标值 */

#include<stdio.h>

#define N 1000
int a[N][N];

int main(void)
{
    /*********Begin*********/
    int m, n, i, j;

    /* 读入数据 */
    printf("Input m, n:");
    scanf("%d,%d", &m, &n);
    printf("Input %d*%d array:\n", m, n);
    for(i = 0; i < m; i++)
        for(j = 0; j < n; j++)
            scanf("%d", &a[i][j]);

    int maxa = a[0][0], row = 0, col = 0;
    for(i = 0; i < m; i++)
        for(j = 0; j < n; j++)
            if(a[i][j] > maxa) maxa = a[i][j], row = i, col = j;

    printf("max=%d, row=%d, col=%d\n", maxa, row + 1, col + 1);
    
    /*********End**********/
    return 0;
}

第4关:二分查找
任务描述
题目描述:将n个从小到大排序的整数(n<1000000)从1~n进行编号,并一个待查找的整数m,请使用二分法进行查找。

输入
输入包括3行,第一行为整数n,第二行包括n个整数,以空格分隔,第三行为整数m。
输出
如果能够在序列中找到整数m,则输出编号(如果存在多个编号,返回编号最小的),如果不存在,则输出None。

测试说明
样例输入:
10
1 2 4 5 6 7 8 9 10 11
10
样例输出:
9

解题程序:

/* 第4关:二分查找 */

#include<stdio.h>

#define N 100
int a[N];

int main(void)
{
    /*********Begin*********/
    int n, x, i, j, mid;

    /* 读入数据 */
    scanf("%d", &n);
    for(i = 0; i < n; i++)
        scanf("%d", &a[i]);
    scanf("%d", &x);

    /* 二分查找 */
    int ans = -1;
    i = 0, j = n - 1;
    while(i <= j) {
        mid = (i + j) / 2;
        if(a[mid] == x) {
            ans = mid;
            break;
        } else if(a[mid] > x)
            j = mid - 1;
        else if(a[mid] < x)
            i = mid + 1;
    }

    if(ans == -1)
        printf("None\n");
    else
        printf("%d\n", ans + 1);
    /*********End**********/
    return 0;
}

第5关:鞍点
任务描述
题目描述:找出具有m行n列二维数组Array的“鞍点”,即该位置上的元素在该行上最大,在该列上最小,其中1<=m,n<=10。

输入
输入数据有多行,第一行有两个数m和n,下面有m行,每行有n个数。

输出
按下列格式输出鞍点:
Array[i][j]=x
其中x代表鞍点,i和j为鞍点所在的数组行和列下标,我们规定数组下标从0开始。
一个二维数组并不一定存在鞍点,此时请输出None
我们保证不会出现两个鞍点的情况,比如:
3 3
1 2 3
1 2 3
3 6 8

样例输入:

3 3
1 2 3
4 5 6
7 8 9

样例输出:

Array[0][2]=3

解题程序:

/* 第5关:鞍点 */

#include<stdio.h>

#define N 10
int a[N][N], maxa[N], mina[N];

int main(void)
{
    /*********Begin*********/
    int m, n, i, j;

    /* 读入数据 */
    scanf("%d %d", &m, &n);
    for(i = 0; i < m; i++)
        for(j = 0; j < n; j++)
            scanf("%d", &a[i][j]);

    /* 初始化最值:行的最大值、列的最小值 */
    for(i = 0; i < m; i++)
        maxa[i] = a[i][0];
    for(i = 0; i < n; i++)
        mina[i] = a[0][i];

    /* 计算最值:行的最大值、列的最小值 */
    for(i = 0; i < m; i++)
        for(j = 0; j < n; j++) {
            if(a[i][j] > maxa[i])
                maxa[i] = a[i][j];
            if(a[i][j] < mina[j])
                mina[j] = a[i][j];
        }

    /* 找鞍点并且输出结果 */
    int flag = 1;
    for(i = 0; i < m; i++)
        for(j = 0; j < n; j++)
            if(maxa[i] == mina[j]) {
                flag = 0;
                printf("Array[%d][%d]=%d\n", i, j, maxa[i]);
                break;
            }
    if(flag)
        printf("None\n");
    /*********End**********/
    return 0;
}

第6关:删除最大值
任务描述
题目描述:输入10个互不相同的整数并保存在数组中,找到该最大元素并删除它,输出删除后的数组

输入

输入10个互不相同整数

输出

输出删除最大元素后的数组

样例输入:

1 2 3 4 5 6 7 8 9 0

样例输出:

1 2 3 4 5 6 7 8 0

解题说明:
真正把数据删除,动作太多,计算量太大。做个标记即可,计算速度快。
解题程序:

/* 第6关:删除最大值 */

#include<stdio.h>

#define N 10
int a[N];

int main(void)
{
    /*********Begin*********/
    int i;
    for(i = 0; i < N; i++)
        scanf("%d", &a[i]);

    int maxa = a[0], k = 0;
    for(i = 1; i < N; i++)
        if(a[i] > maxa) maxa = a[i], k = i;

    for(i = 0; i < N; i++)
        if(i != k)
            printf("%d ", a[i]);
    printf("\n");
    /*********End**********/
    return 0;
}

第7关:杨辉三角
任务描述
题目描述:还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

测试说明
平台会对您的代码进行运行测试,如果实际输出与预期输出相同,则算通关。

输出

打印出杨辉三角图形的10行。格式见题目描述部分。每个整数后面接一个空格来分隔开整数

解题程序:

/* 第7关:杨辉三角 */

#include<stdio.h>
#include<string.h>

#define N 10
int a[N + 1];

int main(void)
{
    /*********Begin*********/
    memset(a, 0, sizeof(a));
    a[1] = 1;

    int i, j;
    for(i = 1; i <= N; i++) {
        for(j = i; j >= 1; j--)
            a[j] += a[j - 1];
        
        printf("%d", a[1]);
        for(j = 2; j <= i; j++)
            printf(" %d", a[j]);
        printf("\n");
    }

    /*********End**********/
    return 0;
}