2023秋电子科大信软 程算I 机考真题

基本情况

对应课程:程序设计与算法基础I

考试时间:2小时

题型:函数题+编程题

考试年级:2023级

函数题只需要完成期中一些(个)函数即可

编程题需要自己手动写main函数

提示:本次考试为首次全年级机考,分上下午场(共三场)

考试这次不能看到实际评分(即程序通过了多少测试样例),只能提交,可以debug


上午场

求倍数的和

(题目编号:204)

题目描述

输入 N 个整数,计算并输出这 N 个数中 3的倍数 之和。

输入格式

第一行是一个正整数 N,表示第二行有 N 个数。

第二行是 N 个用空格隔开的整数。

输出格式

一个整数结果。

数据范围

0 < N < 100
0 ≤ 输入的整数 ≤ 40000

输入样例1

3
114514 1919 81

输出样例1

81

输入样例2

2
100 100

输出样例2

0

输入样例3

10
1 2 3 4 5 6 7 8 9 10

输出样例3

18

代码模板

(代码模板为题目给出的写好的,需要在指定区域写)

#include <stdio.h>

// 你的代码写在 TODO和END OF TODO之间。
// 请勿修改这对标签外的任何代码!!!

/**
 * @brief 循环输入n个非负数,求这n个数中3的倍数之和
 * 
 * @param n 数值的个数
 * @return int 3的倍数之和
 */
int summary(int n) {
    // 在此函数中,需要用到整数输入
    // TODO
    
    // END OF TODO
}

int main() {
    int N;
    scanf("%d", &N);

    printf("%d\n", summary(N));
    return 0;
}

线性表是否是非递减序列

(题目编号:205)

题目描述

【定义】线性表是一种存储数据的结构,其C语言描述如下:

// 线性表的最大容量
#define CAPACITY  128

typedef struct {
    int len; // 线性表实际存储的元素个数
    int data[CAPACITY]; // 数组形式的存储空间。数据存储在该数组前len个单元中,后面的单元空置
} list;

给定一个有 N 个元素的线性表,判断这个线性表是否是非递减序列

【定义】非递减序列满足这样的条件:序列中任意相邻两项,后项不小于前项

例如:[1 2 2 3 4 5]是非递减序列;[1 2 2 3 1 5]则不是。

输入格式

第一行是一个正整数 N,表示线性表元素的个数。

第二行是 N 个用空格隔开的整数。

输出格式

如果是非递减序列,输出字符串 yes。

如果不是,输出第一个违例的前后两项元素值,用空格隔开。

数据范围

1 ≤ N ≤ CAPACITY
线性表元素是任意整数值

输入样例1

1
-3

输出样例1

yes

输入样例2

10
1 2 2 3 3 3 4 5 6 6

输出样例2

yes

输入样例3

10
1 2 2 3 -1 3 4 5 6 6

输出样例3

3 -1

代码模板

(代码模板为题目给出的写好的,需要在指定区域写)

#include <stdio.h>

// 你的代码写在 TODO和END OF TODO之间。
// 请勿修改这对标签外的任何代码!!!


// 线性表的最大容量
#define CAPACITY  128

typedef struct {
    int len; // 线性表实际存储的元素个数
    int data[CAPACITY]; // 数组形式的存储空间。数据存储在该数组前len个单元中,后面的单元空置
} list;


/**
 * @brief 判断线性表是否是非递减序列
 * 
 * @param L 线性表指针
 * @return int* 如果是非递减序列,返回NULL;否则,返回第一个违例的前项元素地址
 */
int* is_increasing(list *L) {
    // TODO

    // END OF TODO
}


int main() {
    // 定义线性表及其指针
    list l, *L = &l;

    // 输入线性表长度
    scanf("%d", &L->len);
    int* p = L->data;
    // 输出线性表元素
    for (int i = 0; i < L->len; ++i, ++p)
        scanf("%d", p);

    // 判断
    p = is_increasing(L);

    // 输出结果
    if (p == NULL) {
        printf("yes\n");
    } else {
        printf("%d %d\n", *p, *(p+1));
    }
    
    return 0;
}

指定字符的出现次数

(题目编号:206)

题目描述

输入一个字符c,随后输入一个字符串S,找出c在S中的出现次数。

输入格式

第一行输入一个字符c,第二行输入一个只由小写英文字母a~z组成的字符串S。

输出格式

一个整数答案。

数据范围

'a' ≤ c ≤ 'z'
0 < len(S)  ≤ 1000

输入样例1

s
uesutcsise

输出样例1

3

输入样例2

a
uestcop

输出样例2

0

输入样例3

w
whatifwhatifwelefttoday

输出样例3

3

代码模板

(代码模板为题目给出的写好的,需要在指定区域写)

#include <stdio.h>

// 你的代码写在 TODO和END OF TODO之间。
// 请勿修改这对标签外的任何代码!!!

/**
 * @brief 统计字符c在s中出现的次数
 * 
 * @param s 字符串
 * @param c 字符
 * @return int 字符c的出现字数
 */
int repeat_char(char *s, char c) {
    // TODO

    // END OF TODO
}

char S[1000];
int main() {
    char c;
    c = getchar();
    scanf("%s", S);
    printf("%d\n", repeat_char(S, c));
    
    return 0;
}

十进制转二进制

(题目编号:207)

题目描述

十进制转二进制在计算机科学中经常用到。这里提供了一种常见的转换算法即除法取余法,请完成该算法。

【算法】

  1. 从右往左,将十进制数逐步除以2,记录每一步的余数。

  2. 将得到的余数从下往上排列,即得到二进制数的每一位。

  3. 将商作为新的被除数,重复上述步骤,直到商为0。

【案例】以十进制数 26 为例

  1. 26 ÷ 2 = 13余0,记录这个余数。这是最低位(最右边)。

  2. 13 ÷ 2 = 6余1,记录这个余数。

  3. 6 ÷ 2 = 3余0,记录这个余数。

  4. 3 ÷ 2 = 1余1,记录这个余数。

  5. 1 ÷ 2 = 0余1,记录这个余数。现出商为 0,计算过程结束。此时的余数是最高位(最左边)的。

  6. 因此,26 的二进制表示为余数记录的倒序:11010。

输入格式

一个十进制正整数 N。

输出格式

N转二进制后的结果。

数据范围

0 ≤ N ≤ 1000

输入样例1

2

输出样例1

10

输入样例2

66

输出样例2

1000010

输入样例3

999

输出样例3

1111100111

代码模板

(代码模板为题目给出的写好的,需要在指定区域写)

#include <stdio.h>

// 你的代码写在 TODO和END OF TODO之间。
// 请勿修改这对标签外的任何代码!!!

/**
 * @brief 将十进制整数转换为二进制数,并显示
 * 
 * @param d 十进制正整数
 */
void dtob(int d) {
    // 此函数要用到输出
    // TODO

    // END OF TODO
}

int main() {
    int d;
    scanf("%d", &d);

    dtob(d);

    return 0;
}

中午场

水质达标统计

(题目编号:208)

找出最小值

连续 N 天对沙河的水质进行检测,每天的水质value是一个正整数。有水质阈值T,当且仅当当日 value≥T 时认为水质合格,请输出水质合格的天数。

输入格式

第一行是一个正整数 N,表示第二行有 N 个数。

第二行是一个正整数 T,表示指定的水质阈值。

第三行是 N 个用空格隔开的整数。

输出格式

一个整数结果。

数据范围

0 < N < 100
100 ≤ T ≤ 200
0 ≤ 输入的整数 ≤ 40000

输入样例1

5
100
90 80 100 200 400

输出样例1

3

输入样例2

1
100
80

输出样例2

0

代码模板

(代码模板为题目给出的写好的,需要在指定区域写)

#include <stdio.h>

// 你的代码写在 TODO和END OF TODO之间。
// 请勿修改这对标签外的任何代码!!!

/**
 * @brief 循环输入n个正整数表示的水质,输入阈值,统计大于等于阈值的个数
 * 
 * @param n 数值的个数
 * @return int 统计值
 */
int qualified(int n) {
    // 在此函数中,需要用到整数输入
    // TODO

    // END OF TODO
}

int main() {
    int N;
    scanf("%d", &N);

    printf("%d\n", qualified(N));
    return 0;
}

求交集

(题目编号:209)

【定义】两个集合A和B的交集(intersection)C定义为:包含既在A中又在B中的元素。

给定两个无重复元素的无序的正整数集合A和B,求这两个集合的交集并输出。交集仍是无序的

【算法】

k = 0
对 A 中每一个元素 a: {
    对 B 中每一个元素 b: {
        如果 a 等于 b: C[k++] = a
    }
}
C[k] = -1

输入格式

第一行是用空格隔开的集合A的元素。最后一个值-1表示输入结束。注:-1不是集合的元素。

第二行是用空格隔开的集合B的元素。最后一个值-1表示输入结束。注:-1不是集合的元素。

测试用例保证交集至少有一个元素

输出格式

输出在一行的、用空格隔开的A和B交集的元素。

数据范围

0 < 输入值的个数 ≤ 20

输入样例1

1 3 5 -1
2 3 5 6 -1

输出样例1

3 5

输入样例2

6 7 8 9 2 -1
2 -1

输出样例2

2

输入样例3

1 2 3 -1
3 2 1 -1

输出样例3

1 2 3

代码模板

(代码模板为题目给出的写好的,需要在指定区域写)

#include <stdio.h>

// 你的代码写在 TODO和END OF TODO之间。
// 请勿修改这对标签外的任何代码!!!


/**
 * @brief 求集合的交集
 * 
 * @param A 输入集合
 * @param B 输入集合
 * @param C A和B的交集
 */
void intersect(int *A, int *B, int *C) {
    // TODO

    // END OF TODO
}



/**
 * @brief 输入以-1结尾的正整数集合(数组)
 * 
 * @param S 集合
 */
void input_set(int *S) {
    int i = 0, v;
    do {
        scanf("%d", &v);
        S[i++] = v;
    } while (v != -1);
}

// 集合最大元素个数
#define MAXN    20

int main() {
    int A[MAXN], B[MAXN], C[MAXN];

    input_set(A);
    input_set(B);
    
    intersect(A, B, C);
    for (int i = 0; C[i] != -1; ++i)
        printf("%d ", C[i]);
    printf("\n");

    return 0;
}

读取字符串的整数

(题目编号:210)

一个字符串中可能嵌入了一个整数(如果有,则只有这一个)。编写程序读取这个整数并输出。

输入格式

一行字符串S

输出格式

字符串中嵌入的整数。如果没有嵌入的整数,那么输出0。

数据范围

0 < len(S) ≤ 1000

输入样例1

abc1234def

输出样例1

1234

输入样例2

1234.

输出样例2

1234

输入样例3

abcde

输出样例3

0

代码模板

(代码模板为题目给出的写好的,需要在指定区域写)

#include <stdio.h>

// 你的代码写在 TODO和END OF TODO之间。
// 请勿修改这对标签外的任何代码!!!


/**
 * @brief 读取字符串中的整数
 * 
 * @param s 字符串
 * @return int 字符串中嵌入的整数。如果没有,则返回0。
 */
int get_int(char *s) {
    // 在此函数中,需要用到字符输出
    // TODO


    // END OF TODO
}

char S[1000];
int main() {
    scanf("%s", S);
    printf("%d\n", get_int(S));
    
    return 0;
}

判断是否是亲密数对

[编者注:这个题改编自2021级的期末题,改简单了]

(题目编号:211)

【定义】亲密数对指的是一对正整数 m 和 n,m 的真因子之和等于 n,n 的真因子之和等于 m。其中,正整数 x 真因子 y 指得是 y < x 且 x 能被 y 整除。

输入正整数 m 和 n,判断它们是否是亲密数对。

【算法】

  1. 先求 m 的真因子之和 x
  2. 再求 n 的真因子之和 y
  3. 如果 x == y,则 m 和 n 是亲密数对;否则不是

输入格式

两个正整数 m 和 n,用空格隔开。

输出格式

m 和 n 是亲密对,输出 n m,用空格隔开

否则输出字符串 "not"。

数据范围

0 < n ≤ 10000
0 < m ≤ 10000

输入样例1

220 284

输出样例1

284 220

输入样例2

2620 2924

输出样例2

2924 2620

输入样例3

580 290

输出样例3

not

代码模板

(代码模板为题目给出的写好的,需要在指定区域写)

#include <stdio.h>

// 你的代码写在 TODO和END OF TODO之间。
// 请勿修改这对标签外的任何代码!!


/**
 * @brief 求x的所有真因子之和
 * 
 * @param x 正整数
 * @return int 真因子之和
 */
int sum_of_factor(int x) {
    // TODO
    
    // END OF TODO
}

/**
 * @brief 判断是否是亲密数对
 * 
 * @param m 数1
 * @param n 数2
 */
void is_intimate(int m, int n) {
    // TODO
    // 这个程序要用到输出
    
    // END OF TODO
}


int main() {
    int m, n;
    scanf("%d%d", &m, &n);

    is_intimate(m, n);
    
    return 0;
}

下午场

空气质量检测

(题目编号:212)

成都最近的雾霾很严重,连续 N 天对成都的空气质量进行检测,每天的空气质量value是一个正整数。有空气质量阈值T,当且仅当当日 value≤T 时认为空气质量合格,请输出空气质量合格的天数。

输入格式

第一行是一个正整数 N,表示第三行有 N 个数。

第二行是一个正整数 T,表示指定的空气质量阈值 T 。

第三行是 N 个用空格隔开的整数。

输出格式

一个整数结果。

数据范围

0 < N < 100
20 < T < 100
0 ≤ 输入的整数 ≤ 40000

输入样例1

3
80
114514 1919 810

输出样例1

0

输入样例2

2
50
10 50

输出样例2

2

输入样例3

10
90
70 80 90 100 110 120 130 140 150 160

输出样例3

3

代码模板

(代码模板为题目给出的写好的,需要在指定区域写)

#include <stdio.h>

// 你的代码写在 TODO和END OF TODO之间。
// 请勿修改这对标签外的任何代码!!!

/**
 * @brief 循环输入n个正整数表示空气质量,输入阈值,统计小于等于阈值的天数
 * 
 * @param n 输入数值的个数
 * @return int 小于等于阈值的天数
 */
int find_num(int n , int t) {
    // 在此函数中,需要用到整数输入
    // TODO

    // END OF TODO
}

int main() {
    int N,T;
    scanf("%d", &N);
    scanf("%d",&T);
    
    printf("%d\n", find_num(N,T));
    return 0;
}

线性表查找并删除元素

(题目编号:213)

线性表查找并删除元素

【定义】线性表是一种存储数据的结构,其C语言描述如下:

// 线性表的最大容量
#define CAPACITY  128

typedef struct {
    int len; // 线性表实际存储的元素个数
    int data[CAPACITY]; // 数组形式的存储空间。数据存储在该数组前len个单元中,后面的单元空置
} list;

输入一个有 N 个元素的线性表,输入一个值 value,将线性表内部数组中值为 value 的元素删除,原有元素依次前移。

注:原始线性表满足每个元素最多出现一次。

输入格式

输入分三行:

第一行是一个正整数 N,表示元素的个数。

第二行是 N 个用空格隔开的元素值。

第三行是一个正整数 value ,表示要删除的元素的值。

测试用例保证要删除的元素是存在的。

输出格式

一行,用空格隔开输出删除操作后的线性表

数据范围

0 < N ≤ CAPACITY
0 ≤ value ≤ 1000
线性表元素是任意整数值

输入样例1

9
99 22 77 44 55 66 33 88 11
22

输出样例1

99 77 44 55 66 33 88 11

输入样例2

9
99 22 77 44 55 66 33 88 11
11

输出样例2

99 22 77 44 55 66 33 88

输入样例3

9
99 22 77 44 55 66 33 88 11
99

输出样例3

22 77 44 55 66 33 88 11

代码模板

(代码模板为题目给出的写好的,需要在指定区域写)

#include <stdio.h>

// 你的代码写在 TODO和END OF TODO之间。
// 请勿修改这对标签外的任何代码!!!


// 线性表的最大容量
#define CAPACITY  128

typedef struct {
    int len; // 线性表实际存储的元素个数
    int data[CAPACITY]; // 数组形式的存储空间
} list;


/**
 * @brief 在线性表中删除指定元素
 * 
 * @param L 线性表指针
 * @param value 删除的元素
 */
void del(list *L, int value) {
    // TODO

    // END OF TODO
}


int main() {
    // 定义线性表及其指针
    list l, *L = &l;

    // 输入线性表长度
    scanf("%d", &L->len);
    // 输入线性表元素
    for (int i = 0; i < L->len; ++i)
        scanf("%d", &L->data[i]);
    
    int value;
    // 输入要删除的元素
    scanf("%d", &value);

    // 删除操作
    del(L, value);

    // 输出删除后的线性表
    for (int i = 0; i < L->len; ++i)
        printf("%d ", L->data[i]);
    printf("\n");

    return 0;
}

见不得O

(题目编号:214)

输入一个字符串S,将S中出现的O(大写字母O)替换为P(大写字母P)后重新输出字符串。

要求:不使用C语言字符串库

输入格式

一行字符串。

输出格式

一行替换元素后的字符串

数据范围

0 < len(S) ≤ 1000

输入样例1

abcdef

输出样例1

abcdef

输入样例2

OOOoooPPP

输出样例2

PPPoooPPP

输入样例3

OoO

输出样例3

PoP

代码模板

(代码模板为题目给出的写好的,需要在指定区域写)

#include <stdio.h>

// 你的代码写在 TODO和END OF TODO之间。
// 请勿修改这对标签外的任何代码!!!


/**
 * @brief 输入一个字符串S,将S中出现的O(大写字母O)替换为P(大写字母P)后重新输出字符串。
 *        本题不能使用C库函数,如果使用库函数,则视为0分!
 * @param s 字符串
 */
void puts_replace(char *s) {
    // 此函数要用到字符输出
    // TODO

    // END OF TODO
}

char S[1000];
int main() {
    scanf("%s", S); // 输入时,用~代替空格
    puts_replace(S);
    
    return 0;
}

区间内的质数之和

(题目编号:215)

给定两个正整数a,b请求出区间[a,b]内的质数之和并输出。

注:质数,指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

注:一种常见的判断一个数是否为质数的算法:根号范围遍历。利用合数定理——如果一个数是合数,那么它的最小质因数肯定小于等于他的平方根

例如:

输入 10 23

则区间[10,23]内的质数为 11 13 17 19 23

输出质数之和为 83

输入格式

两个正整数 a , b。

输出格式

一个正整数,即区间[a,b]内的质数之和。

数据范围

1 ≤ n ≤ 10000 ,n ≤ m ≤ 10000 

输入样例1

5 5

输出样例1

5

输入样例2

1 50

输出样例2

328

代码模板

(代码模板为题目给出的写好的,需要在指定区域写)

#include <stdio.h>

// 你的代码写在 TODO和END OF TODO之间。
// 请勿修改这对标签外的任何代码!!!


/**
 * @brief 给定两个正整数a,b 求出区间[a,b]内的质数之和
 * 
 * @param a 区间下界
 * @param b 区间上界
 * @return int 区间内的质数之和
 */
int prime_sum(int a,int b) {
    // TODO

    // END OF TODO
}


int main() {
    int a,b;
    scanf("%d", &a);
    scanf("%d", &b);
    
    printf("%d\n", prime_sum(a,b));

    return 0;
}

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谨慎谦虚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值