2023秋电子科大信软 程算I 机考真题
基本情况
对应课程:程序设计与算法基础I
考试时间:2小时
题型:函数题+编程题
函数题只需要完成期中一些(个)函数即可
编程题需要自己手动写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)
题目描述
十进制转二进制在计算机科学中经常用到。这里提供了一种常见的转换算法即除法取余法,请完成该算法。
【算法】
-
从右往左,将十进制数逐步除以2,记录每一步的余数。
-
将得到的余数从下往上排列,即得到二进制数的每一位。
-
将商作为新的被除数,重复上述步骤,直到商为0。
【案例】以十进制数 26 为例
-
26 ÷ 2 = 13余0,记录这个余数。这是最低位(最右边)。
-
13 ÷ 2 = 6余1,记录这个余数。
-
6 ÷ 2 = 3余0,记录这个余数。
-
3 ÷ 2 = 1余1,记录这个余数。
-
1 ÷ 2 = 0余1,记录这个余数。现出商为 0,计算过程结束。此时的余数是最高位(最左边)的。
-
因此,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;
}
判断是否是亲密数对
(题目编号:211)
【定义】亲密数对指的是一对正整数 m 和 n,m 的真因子之和等于 n,n 的真因子之和等于 m。其中,正整数 x?真因子?y 指得是 y < x 且 x 能被 y 整除。
输入正整数 m 和 n,判断它们是否是亲密数对。
【算法】
- 先求 m 的真因子之和 x
- 再求 n 的真因子之和 y
- 如果 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;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!