您的当前位置:首页正文

2024年C语言计算机能力挑战赛赛前真题模拟(一)(已完结)

2024-11-21 来源:个人技术集锦

2024年C语言计算机能力挑战赛赛前真题模拟

A卷:

#include<stdio.h>
void main()
{
    int i, j, x, n, a[10], s = 0, s1 = 0;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
        scanf("%d", &a[i]);
    while (n != 1) {
        for (i = 0; i < n - 1; i++)
            for (j = i + 1; j < n; j++)
            {
                if (a[i] < a[j])
                {
                    x = a[i];
                    a[i] = a[j];
                    a[j] = x;
                }
            }
        s1 = a[n - 1] + a[n - 2];
        s += s1;
        a[n - 2] = s1;
        n = n - 1;
    }
    printf("%d", s);
}

#include<stdio.h>
struct score
{
    char a[20];
    int b;
}stu[100], x;
void main() {
    int n, i, j;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
        scanf("%s%d", stu[i].a, &stu[i].b);
    for (i = 0; i < n - 1; i++)

        for (j = i + 1; j < n; j++)
            if ((stu[i].b < stu[j].b) || (stu[i].b == stu[j].b) && (stu[i].a[0] > stu[j].a[0]))
            {
                x = stu[i];
                stu[i] = stu[j];
                stu[j] = x;
            }
    for (i = 0; i < n; i++)
    {
        printf("%s %d", stu[i].a, stu[i].b);
        printf("\n");
    }
}

B卷:

#include<stdio.h>
#include<math.h>
void main()
{
    int a[10], b[10], n, i; float s = 0.0;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
        scanf("%d%d", &a[i], &b[i]);
    for (i = 1; i < n; i++)
        s += sqrt(pow(a[i] - a[i - 1], 2) + pow(b[i] - b[i - 1], 2));
    printf("%.2f", s);
}

#include<stdio.h>
struct stu
{
    int a;
    int score;
}c[10];
void main() {
    int m, n, i, j;
    struct stu x;
    scanf("%d%d", &m, &n);
    for (i = 0; i < m; i++)
    {
        scanf("%d", &c[i].score);
        c[i].a = i + 1;
    }
    for (i = 0; i < m - 1; i++)
        for (j = i + 1; j < m; j++)
            if (c[i].score < c[j].score)
            {
                x = c[i];
                c[i] = c[j];
                c[j] = x;
            }
    for (i = 0; i < n; i++)
        printf("%3d", c[i].a);
}

#include<stdio.h>
struct stu
{
    char a[10];
    int chinese;
    int math;
    int english;
    int sum;
}stu[20];
void main()
{
    int n, i, j; struct stu x;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    scanf("%s%d%d%d",stu[i].a,& stu[i].chinese, &stu[i].math, &stu[i].english);
    for (i = 0; i < n; i++)
        stu[i].sum = stu[i].chinese + stu[i].math + stu[i].english;
    //输出总分最高的
    for(i=0;i<n-1;i++)
        for(j=i;j<n;j++)
            if (stu[i].sum < stu[j].sum)
            {
                x = stu[i];
                stu[i] = stu[j];
                stu[j] = x;
            }
    i = 0;
    do {
        printf("%s %d ", stu[i].a,stu[i].sum);
        i++;
    } while (stu[i-1].sum==stu[i].sum);
    printf("\n");
    //输出语文最高的
    for (i = 0; i < n - 1; i++)
        for (j = i; j < n; j++)
            if (stu[i].chinese < stu[j].chinese)
            {
                x = stu[i];
                stu[i] = stu[j];
                stu[j] = x;
            }
    i = 0;
    do {
        printf("%s %d ", stu[i].a,stu[i].chinese);
        i++;
    } while (stu[i-1].chinese == stu[i].chinese);
    printf("\n");
    //输出数学最高的
    for (i = 0; i < n - 1; i++)
        for (j = i; j < n; j++)
            if (stu[i].math < stu[j].math)
            {
                x = stu[i];
                stu[i]= stu[j];
                stu[j] = x;
            }
    printf("%s %d ", stu[i].a,stu[0].math);
    printf("\n");
    //输出英语最高的
    for (i = 0; i < n - 1; i++)
        for (j = i; j < n; j++)
            if (stu[i].english < stu[j].english)
            {
                x = stu[i];
                stu[i] = stu[j];
                stu[j] = x;
            }
    printf("%s %d ", stu[i].a,stu[0].english);
    printf("\n");
}

#include<stdio.h>
void main() {
    int a, n = 0, i;
    scanf("%d", &a);
    for (i = 2; i < a; i++)
        if (a % i == 0)
            n += i;
    printf("%d", n);
}

C卷:

解析:详细过程见2020年真题

输入一行由字符a~z和A~Z组成的字符串,字符串长度<=10000, 求其中任意两个字符出现次数的差值的绝对值

输入: 第一行输入字符串 第二行输入两个字符。

输出: 输出这两个字符出现次数的差值的绝对值

输入样例: AbddeDfacd A d

输出样例: 2

(解释:字符串中字符'A'出现了2次,字符'd'出现了4次,则结果 为|2-4|=2)

解析:详细过程见2021真题48

写个一个程序统计从1到N这N个数中,以下三个条件都满足 的数字x个数

1. x是一个素数(如2,3,5,7....)

2. x是一个对称的数 (如1,11,121,都是对称的数)

3. x的所有数字和恰好是7的倍数(如 7,16,25,34,43,61,70,115,)

输入:一个整数N(1<=N<=10000)

输出: 满足这三个条件的个数

样例输入: 20 样例输出 1

样例解释: 从1~20中素数有2,3,5,7,11,13,17,19,再结合条件2可以 看到对称的数只有 2 3 5 7 11,又因为条件3,所以只有7满足要求,所以输 出个数为1

某个绿化园区的树排列成为n*m的矩阵,其中用

 示第i行第j列的树的茂密度。

为了使全部的树木茁壮成长,茂密度越高的树 应该浇水越多,但是小明只能保证若是一棵树的茂密度高于它相邻(上下左右)的树,则这颗树需要浇水的位置是。

解析:程序首先定义了一个二维数组density来存储树木的茂密度,以及一个二维布尔数组shouldWater来标记哪些树需要浇水。然后,它遍历整个矩阵,检查每棵树是否比其相邻的树茂密度更高,如果是,则在shouldWater数组中对应的位置标记为true。最后,程序打印出需要浇水的树的位置。

#include <stdio.h>
#include <stdbool.h>
#define MAX_N 100
#define MAX_M 100
// 定义一个二维数组来存储树木的茂密度
int density[MAX_N][MAX_M];
bool shouldWater[MAX_N][MAX_M];
// 检查坐标是否合法
bool isValid(int x, int y, int n, int m) {
    return x >= 0 && x < n && y >= 0 && y < m;
}
// 标记需要浇水的树
void markTreesToWater(int n, int m) {
    // 初始化shouldWater数组
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            shouldWater[i][j] = false;
        }
    }
    // 遍历矩阵
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            // 检查上方
            if (isValid(i - 1, j, n, m) && density[i][j] > density[i - 1][j]) {
                shouldWater[i][j] = true;
            }
            // 检查下方
            if (isValid(i + 1, j, n, m) && density[i][j] > density[i + 1][j]) {
                shouldWater[i][j] = true;
            }
            // 检查左方
            if (isValid(i, j - 1, n, m) && density[i][j] > density[i][j - 1]) {
                shouldWater[i][j] = true;
            }
            // 检查右方
            if (isValid(i, j + 1, n, m) && density[i][j] > density[i][j + 1]) {
                shouldWater[i][j] = true;
            }
        }
    }
}
// 打印需要浇水的树的位置
void printTreesToWater(int n, int m) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (shouldWater[i][j]) {
                printf("(%d, %d) ", i, j);
            }
        }
        printf("\n");
    }
}
int main() {
    int n, m;

    // 输入矩阵的大小
    printf("请输入矩阵的行数n和列数m:\n");
    scanf("%d %d", &n, &m);
    // 输入矩阵的茂密度
    printf("请输入矩阵的茂密度:\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d", &density[i][j]);
        }
    }
    // 标记需要浇水的树
    markTreesToWater(n, m);
    // 打印需要浇水的树的位置
    printf("需要浇水的树的位置为:\n");
    printTreesToWater(n, m);
    return 0;
}

//编写程序,输入n个整数存放一维数组中,按从小到大的顺序排列成一个有序序列,并删除数据中有相同的数,使之只剩一个,例如:一维数组中的数据是:6 4 3 4 3 6 4 2 3 4 6 3 2 3,删除后数组中元素为:2346。
//输入格式:

//第一行,输入一个正整数n, 代表数组中元素个数; (0 < n <= 10000);
//第二行,输入n个正整数,代表一维数组中的元素(不大于1000)。

//输出格式,删除后数组中元素

解析:

#include<stdio.h>
void main()
{
    int a[100],n, i,j,m;
    scanf("%d",&n);
    for (i = 0; i < n; i++)
        scanf("%d",&a[i]);
    for(i=0;i<n-1;i++)
        for(j=i;j<n;j++)
            if (a[i] > a[j])
            {
                m = a[i];
                a[i] = a[j];
                a[j] = m;
            }
    for(i=0;i<n-1;i++)
        for(j=i+1;j<n;j++)
            if (a[i] == a[j])
            {
                for (m = j + 1; m < n; m++)
                    a[m - 1] = a[m];
                n--;
                j--;
            }
    for (i = 0; i < n; i++)
        printf("%d", a[i]);
}

显示全文