1、2017年海淀区中小学生信息学奥林匹克竞赛 1 / 5 2017年海淀区中小学生信息学奥林匹克竞赛 小学组竞赛试题(每题 100分,共 700分 ) 答题 注意 事项 : ( 1)请 使用 QBASIC( BC7.0版本)或 C/C+( DEVC+5.11版本) 语言 编程 环境; ( 2)以各 自 题 目 要求的名称 ( 如: isbn.bas/或 isbn.c/或 isbn.cpp) 命名 保存 源文件; ( 3)输入输出均采用文件读写,将 写好的源文件 保 存入 D:TEST文件夹中 按要求 提交 。 如: D:TEST isbn.cpp number.cpp id.cpp stick.
2、cpp 1、 ISBN码 ( 100分) ( 源文件名称: isbn.cpp/isbn.c/isbn.bas) 【 题目描述 】 每一本正式出版的图书都有一个 ISBN 码与之对应, ISBN 码包括 9 位数字、 1 位识别码和 3个 分隔符,其规定格式如“ x-xxx-xxxxx-x”,其中符号“ -”就是分隔符(键盘上的减号),最后一位是识别码,例如 0-670-82162-4 就是一个标准的 ISBN 码。 ISBN 码的首位数字表示书籍的出版语言,例如 0代表英语;第一个分隔符“ -”之后的三位数字代表出版社,例如 670代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编
3、号;最后一位为识别码。识别码的计算方法如下:首位数字乘以 1,加上次位数字乘以 2, ,以此类推,第九位数字乘以 9,最后用所得的结果 mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母 X。例如 ISBN 号码 0-670-82162-4 中的识别码 4 是这样得到的:对 067082162这 9个数字,从左至右,分别乘以 1, 2, .,9,再求和,即 0 1+6 2+ +2 9=158,然后取 158 mod 11的结果 4作为识别码。 你的任务是编写程序判断输入的 ISBN 码中识别码是否正确,如果正确,则仅输出“ Right”;如果错误,则输出你认为是正确的 IS
4、BN码。 【 输入 文 件 】 文件名 为 : isbn.in 仅 一行,一个字符 串 ,表示一本书的 ISBN码( 输入 保证 符合 ISBN码的格式要求)。 【 输出 文件 】 文件名 为 : isbn.out 共一行,假如输入的 ISBN码的识别码正确, 就 输出“ Right”,否则,按照规定的格式,输出正确的 ISBN码(包括分隔符“ -”)。 【 样例输入 】 0-670-82162-0 【 样例输出 】 0-670-82162-4 2017年海淀区中小学生信息学奥林匹克竞赛 2 / 5 2、第 N个智慧数 ( 100分) ( 源文件名称: number.cpp/ number.c
5、/ number.bas) 【 题目描述 】 一个正整数如果能表示成了两个正整数的平方差,则称这个数为“智慧数”,比如 16就等于 5的平方减去 3的平方,所以 16就是一个智慧数,从 1开始的自然数列中,将“智慧数”从小到大编号为 1,2,3, n。现 输入一个正整数 n,输出第 n个“智慧数”。 【 输入 文件 】 文件名 为 : number.in 文件中 仅包含一个正整数 n。 【 输出 文件 】 文件名 为 : number.out 文件中 仅包含 一个正整数,表示编号为 n的智慧数。 【 样例输入 】 3 【 样例输出 】 16 【 数据范围 】 1 n),然后按所有刻度线将该木棍
6、锯成小段,计算并输出长度最长的木棍的长度和根数。 【输入文件】 文件名 为 : stick.in 文件中 仅有一行,包含三个正整数 L, m和 n,两两之间用一个空格分隔。 【 输出 文件 】 文件名 为 : stick.out 文件 包含两个正整数 a和 k,分别表示最长木棍的长度和根数。(为了简化题目的难度,所有的测试数据中 m和 n一定是 L的约数)。两数间用一个空格分隔。 【 样例输入 】 12 6 4 【 样例输出 】 2 4 【 数据范围 】 1 = L = 100000。 5、坐标统计 ( 100分) ( 源 文件名称: count.cpp/ count.c/ count.bas
7、) 【 题目描述 】 输入 n 个点在平面上 的 坐标(横纵坐标都是整数),对于每个点可以控制所有位于它左下方的点(即横坐标 x和纵坐标 y都比它小),它可以控制的点的数目称为“战斗力”。依次输出每个点的战斗力,最后输出战斗力最高的点的编号(如果若干个点的战斗力并列最高,输出其中最大的编号)。 【 输入 文件 】 文件名 为 : count.in 第一行包含一个正整数 n,接下来的 n行,每行描述一个点的坐标,第 i+1行包含两个正整数 x和 y,表示编号为 i的点的横坐标为 x,纵坐标为 y。 【 输出 文件 】 文件名 为 : count.out 共有 n+1行第 1行到第 n行,每行包含
8、一个 整数,第 i行的整数表示编号为 i的点的战斗力,第 n+1行表示战斗力最高的点的编号。 【 样例输入 】 6 4 2 6 6 4 8 15 6 11 9 8 14 2017年海淀区中小学生信息学奥林匹克竞赛 4 / 5 【 样例输出 】 0 1 0 1 3 3 6 【 数据范围 】 1=n=100, 1=x=1000, 1=y=1000。 6、打印月历 ( 100分) ( 源文件名称: calen.cpp/ calen.c/ calen.bas) 【 题目描述 】 给你一个年份 y和一个月份 m,请你按照样例的格式打印出 y年第 m 月的月历。例如当 y=2015, m=1时, 2015
9、年 1月的月历打印效果就应该如下: S M T W T F S 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 样例的格式中,第一行为代表星期的字母,第一个字母 S 代表星期日,第二个字母 M代表星期一,以此类推,第七个字母 S 代表星期六,第一个字母的左边没有空格,两个字母之间有三个空格分隔。接下来的几行是第 m 月的日期,每一列的数 都与本列的第一个字母左对齐 , 同一行的两个日期之间 要 有 若干 个 空格分隔。 为了简化题目的难度,输入还会给出一个正整数 n( n小于
10、 8),表示第 y年的 1月 1日是星期 n。例如 2015 1 4的含义是要输出 2015年 1月的月历, 2015年 1月 1日是星期四。 【 输入 文件 】 文件名 为 : calen.in 文件中 仅有一行,包含三个正整数 y, m和 n,两数间用一个空格分隔。 【 输出 文件 】 文件名 为 : calen.out 文件包含 符合题目要求的若干行。 【 样例输入 】 2015 1 4 【 样例输出 】 S M T W T F S 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
11、30 31 2017年海淀区中小学生信息学奥林匹克竞赛 5 / 5 【 数据范围 】 1900 y 2100, 0 m 13, 0 n 8。 【 提示 】 本题 对结果的输出 格式 有严格要求,题目描述的功能可以使用 TAB 键,在 C/C+中可以使用“ t”来实现。 7、分割绳子 ( 100分) ( 源文件名称: cable.cpp/ cable.c/ cable.bas) 【 题目描述 】 现有 N条绳子 , 它 们的长度分别为 L1, L2, Ln,如果从 它 们中切割出 K条长度相同的绳子,这 K条绳子每条最长能有多长? 【 输入 文件 】 文件名 为 : cable.in 共有两行,第一行包含两个正整数 N 和 K,用一个空格分隔;第二行包含 N 个数,依次表示 N条绳子的长度,两数间用一个空格分隔。每条绳子长度的小数不超过两位。 【 输出 文件 】 文件名 为 : cable.out 仅包含一个数,表示所得 K绳子的最大长度。 答案四舍五入保留小数点后两位。 【 样例输入 】 4 11 8.02 7.43 4.57 5.39 【 样例输出 】 2.00 【 数据范围 】 1 = N = 1000, 1 = K = 1000, 1 = Li = 10000