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.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代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。识别码的计算方法如下:首位数字乘以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”;如果错误,则输出你认为是正确的ISBN码。
【输入文件】文件名为:isbn.in
仅一行,一个字符串,表示一本书的ISBN码(输入保证符合ISBN码的格式要求)。
【输出文件】文件名为:isbn.out
共一行,假如输入的ISBN码的识别码正确,就输出“Right”,否则,按照规定的格式,输出正确的ISBN码(包括分隔符“-”)。
【样例输入】0-670-82162-0
垮炖鱼头【样例输出】0-670-82162-4
2、第N个智慧数(100分)
(源文件名称:number.cpp/ number.c/ number.bas)
【题目描述】
一个正整数如果能表示成了两个正整数的平方差,则称这个数为“智慧数”,比如16就等于5的平方减去3的平方,所以16就是一个智慧数,从1开始的自然数列中,将“智慧数”从小到大编号为1,2,3,……,n。现输入一个正整数n,输出第n个“智慧数”。
【输入文件】文件名为:number.in 文件中仅包含一个正整数n。
【输出文件】文件名为:number.out 文件中仅包含一个正整数,表示编号为n的智慧数。【样例输入】3
【样例输出】16
【数据范围】1 <= n <= 100。
3、第m大的身份证号码(100分)
(源文件名称:id.cpp/id.c/id.bas)
【题目描述】
身份证号是我国公民的唯一识别码,它由18位数字或字母组成(只可能最后一位是字母)。18位身份证号码各位的含义如下:第1-2位为省、自治区、直辖市代码;第3-4位为地级市、盟、自治州代码;第5-6位为县、县级市、区代码。第7-14位为出生年月日,比如19970401代表1997年4月1日;第15-16位为顺序号,第17位代表性别,男为单数,女为双数;第18位为校验码,0-9和X。作为尾号的校验码,是把前十七位数字代入统一的公式计算出来的,解答本题你不用关心是如何计算出来的。现在给你n个身份证号码,请你按照出生年月日的字典序(年龄从大到小)输出第m个人的身份证号。
【输入文件】文件名为:id.in
文件中第一行包含两个正整数n和m,两数间用一个空格分隔,接下来的n行每行为一个形如上述格式的身份证号码(不需要关心校验码的正确性,不影响本题解答)。
【输出文件】文件名为:id.out 文件中仅包含一行,为题目要求的一个身份证号码。
【样例输入】4 2
110108************
130211************
420333************
210222************
【样例输出】130211************
【数据范围】1 <= n <= 100,1 <= m <= n。
4、锯木棍(100分)
(源文件名称:stick.cpp/stick.c/stick.bas)
【题目描述】
有一根粗细均匀长度为L的木棍,先用红颜色刻度线将它m等分,再用蓝色刻度线将其n等分(m>n),然后按所有刻度线将该木棍锯成小段,计算并输出长度最长的木棍的长度和根数。
【输入文件】文件名为: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)
【题目描述】
海参的做法大全家常输入n个点在平面上的坐标(横纵坐标都是整数),对于每个点可以控制所有位于它左下方的点(即横坐标x和纵坐标y都比它小),它可以控制的点的数目称为“战斗力”。依次输出每个点的战斗力,最后输出战斗力最高的点的编号(如果若干个点的战斗力并列最高,输出其中最大的编号)。
【输入文件】文件名为:count.in
第一行包含一个正整数n,接下来的n行,每行描述一个点的坐标,第i+1行包含两个正整数x和y,表示编号为i的点的横坐标为x,纵坐标为y。
【输出文件】文件名为:count.out
共有n+1行第1行到第n行,每行包含一个整数,第i行的整数表示编号为i的点的战斗力,第n+1行表示战斗力最高的点的编号。
【样例输入】6
4 2
6 6
4 8
15 6
11 9
8 14
速算【样例输出】0
1
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年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小于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 30 31
【数据范围】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