第24届全国青少年信息学奥林匹克联赛初赛
普及组C++语言试题
竞赛时间:2018 年 10 月 13 日 14:30~16:30
选手注意:
1、试题纸共有 7 页,答题纸共有 2 页,满分 100 分。请在答题纸上作答,写在试题纸上得一律无效。
2、不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料。
一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项) 1、 以下哪一种设备属于输出设备:( ) A、扫描仪 B、键盘 C、鼠标 D、打印机
2、 下列四个不同进制得数中,与其它三项数值上不相等得就是( )。
A、 (269)16 (注解:2 * 16^2 + 6 * 16^1 + 9 * 16 ^0 = 617) B、 (617)10
C、 (1151)8 (注解:1 * 8^3 + 1 * 8^2 + 5 * 8^1 + 1 * 8^0 = 617) D、 (1001101011)2 3、 1MB等于( )。 A、 1000 字节 B、 1024 字节
C、 1000 X 1000字节 D、 1024 X 1024字节
4、 广域网得英文缩写就是( )。 A、 LAN
B、 WAN (Wide Area Network) C、 MAN D、LNA
5、 中国计算机学会于( )年创办全国青少年计算机程序设计竞赛。 A、 1983 B、 1984 C、 1985 D、 1986
6、 如果开始时计算机处于小写输入状态,现在有一只小老鼠反复按照 CapsLock、字母键 A、字母键S、字母键 D、字母键 F 得顺序循环按键,即 CapsLock、A、S、D、F、CapsLock、A、S、D、F、、、、、、、,屏幕上输出得第 81 个字符就是字母 ( )。 A、 A B、 S C、 D D、 a
7、 根节点深度为 0,一棵深度为 h 得满 k(k>1)叉树,即除最后一层无任何子节点外,每一层上得所有结点都有k个子结点得树,共有( )个结点。
A、 (kh+1-1)/(k-1) B、 k h-1 C、 k h
D、 (k h-1) / (k - 1)
8、 以下排序算法中,不需要进行关键字比较操作得算法就是( )。 A、 基数排序 B、 冒泡排序 C、 堆排序
D、 直接插入排序
9、 给定一个含 N 个不相同数字得数组,在最坏情况下,找出其中最大或最小得数,至少需要 N - 1 次比较操作。则最坏情况下,在该数组中同时找最大与最小得数至少需要( )次比较操作。(? ?表示向上取整,? ?表示向下取整) A、 ?3N / 2? - 2 B、 ?3N / 2? - 2 C、 2N - 2 D、 2N - 4
10、 下面得故事与( )算法有着异曲同工之妙。从前有座山,山里有座庙,庙里有个老与尚在给小与尚讲故事:“从前有座山,山里有座庙,庙里有个老与尚在给小与尚讲故事:‘从前有座山,山里有座庙,庙里有个老与尚给小与尚讲故事、、、、、、’” A、 枚举 B、 递归 C、 贪心 D、 分治
11、 由四个没有区别得点构成得简单无向连通图得个数就是( )。 A、 6 B、 7 C、 8 D、9
12、 设含有 10 个元素得集合得全部子集数为 S,其中由 7 个元素组成得子集数为T,则T / S得值为( )。 A、 5 / 32 B、 15 / 128 C、 1 / 8
D、 21 / 128
13、 10000以内,与10000互质得正整数有( )个。 A、 2000 B、 4000 C、 6000 D、 8000
14、 为了统计一个非负整数得二进制形式中 1 得个数,代码如下: int CountBit(int x) {
int ret = 0; while (x)
{
ret++;
___________; }
return ret;
}
则空格内要填入得语句就是( )。 A、 x >>= 1
B、 x &= x - 1 C、 x |= x >> 1 D、 x <<= 1
15、 下图中所使用得数据结构就是( )。
A、 哈希表 B、 栈 C、 队列 D、 二叉树
二、问题求解(共 2 题,每题 5 分,共计 10 分)
1、 甲乙丙丁四人在考虑周末要不要外出郊游。 已知1如果周末下雨,并且乙不去,则甲一定不去;2如果乙去,则丁一定去;3如果丙去,则丁一定不去;4如果丁不去,而且甲不去,则丙一定不去。如果周末丙去了,则甲去了 (去了/没去)(1 分),乙没去(去了/没去)(1 分),丁没去(去了/没去)(1 分),周末没下雨(下雨/ 没下雨)(2 分)。
2、 从 1 到 2018 这 2018 个数中,共有544个包含数字 8 得数。
包含数字 8 得数就是指有某一位就是“8”得数,例如“2018”与“188”。
三、阅读程序写结果(共 4 题,每题 8 分,共计 32 分) 1、
#include<cstdio> char st[100]; int main() {
scanf("%s\ st);
for (int i = 0; st[i]; ++i) { if ('A' <= st[i] && st[i]<= 'Z') st[i] += 1; }
printf(\\n\, st); return 0;
}
输入:QuanGuoLianSai 输出:RuanHuoMianTai 2、
#include<cstdio> int main() { int x;
scanf(\x); int res = 0;
for (int i = 0; i < x; ++i) { if (i * i % x == 1) { ++res;
} }
printf(\", res); return 0;
}
输入:15 输出:4 3、
#include int findans(int n, int m) { if (n == 0) return m; if (m == 0) return n % 3; return findans(n - 1, m) - findans(n, m - 1)- 1); } int main(){ cin >> n >> m; cout << findans(n, m) << endl; return 0; } 输入:5 6 输出:8 4、 #include<cstdio> int n, d[100]; bool v[100]; int main() { scanf(\ &n); for (int i = 0; i < n; ++i) { scanf(\ ndans(n- 1, m +fi v[i] = false; } int cnt = 0; for (int i = 0; i < n; ++i) { if (!v[i]) { for (int j = i; !v[j]; j = d[j]) { v[j] = true; } ++cnt; } } printf("%d\\n\, cnt); return 0; } 输入:10 7 1 4 3 2 5 9 8 0 6 输出:6 四、完善程序(共 2 题,每题 14 分,共计 28 分) 1、 (最大公约数之与)下列程序想要求解整数??得所有约数两两之间最大公约数得与对10007求余后得值,试补全程序。(第一空 2 分,其余 3 分) 举例来说,4得所有约数就是1,2,4。1与2得最大公约数为1;2与4得最大公约数为2;1与4得最大公约数为1。于就是答案为1 + 2 + 1 = 4。 要求 getDivisor 函数得复杂度为0(√n),gcd 函数得复杂度为O(log max(a, b))。 #include using namespacestd; const int N =110000, P = 10007; int n; int a[N], len; int ans; void getDivisor(){ len = 0; for(int i=1; i * i <=n;++i) if (n % i == 0) { a[++len] = i; if( n / i !=i)a[++len]=n/i; } } int gcd(int a,int b) { if (b == 0) { return a; } return gcd(b, a % b); } int main() {