A. 第十三届全国青少年信息学奥林匹克联赛(普及组c语言)的答案
NOIP2007年普及组(C语言)参考答案与评分标准
一、单项选择题:(每题1.5分)
1. D 2. D 3. C 4. B 5. B 6.B 7. B 8. C
9. C 10. A
11. C 12. A 13. A 14. A 15. B 16. D 17. C 18. D
19. A 20. A
二、问题求解:(每题 5分)
1.90
2.210
三、阅读程序写结果
1. 15, 46(对1个数给4分,无逗号扣1分)
2. 3, 6
3. 2 3 5 7 11 13 17 19 23 29
31 37 41 43 47
4. wer2345defgh45456782qqq
四、完善程序(前4空(①--④),每空2.5分,后6空(⑤--⑩),每空3分)
(说明:以下各程序填空可能还有一些等价的写法,各省可请本省专家审定和上机验证,不一定上报科学委员会审查)
1.① c
② i
③ i++,j--
④ reverse(line)
2. ⑤ return
⑥ dr<tr+s && dc<tc+s
⑦ chessboard(tr,tc,tr+s-1,tc+s-1,s)
⑧ chessboard(tr,tc+s,tr+s-1,tc+s,s)
⑨ chessboard(tr+s,tc,tr+s,tc+s-1,s)
⑩ chessboard(tr+s,tc+s,tr+s,tc+s,s)
B. 求第十四届信息学奥赛联赛普及组c语言初赛试题 第三大题第2,3题的解析
2,3,1
递归一次,输入参数循环左移至第一个数小于等于第二个数然后输出
5 4 10 1 6 22 -59 -16 -11 -6
将数组中正数与负数分开排列,从数组起始开始检测非整数数,从数组末尾检测非负数,然后将这两个数调换位置
最后一个递归没时间分析了,下午有事要出门了
C. 求NOIP C语言 普及组 初赛模拟试题 急!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
信息学奥林匹克联赛初赛模拟试题
(普及组 C语言 二小时完成)
一、选择一个正确答案代码(A/B/C/D/E),填入每题的括号内(每题1.5分,共30分)
1.在计算机科学领域,提出“程序=数据结构+算法”的是( )。
A、D.Ritchie B、N.Wirth C、Von Neumann D、Alan Turing E、B.Kernighan
2.下列哪个是最早的计算机程序设计语言( )。
A、C++ B、Java C、FORTRAN D、PASCAL E、COBOL
3.下列软件不是数据库处理软件的是( )。
A、DB2 B、FoxPro C、Foxmail D、Oracle E、Sybase
4.下列哪个公司是生产CPU(中央处理器)的主要公司( )。
A、 Seagate B、AMD C、KINGSTONE D、BENQ E、Sony
5.在微型计算机中,微处理器的主要功能是进行( )。
A、算术逻辑运算及全机的控制
B、逻辑运算
C、算术逻辑运算
D、算术运算
6.DRAM存储器的中文含义是( )。
A、静态随机存储器
B、动态只读存储器
C、静态只读存储器
D、动态随机存储器
7.操作系统的主要功能是( )。
A、控制和管理计算机系统软硬件资源
B、对汇编语言、高级语言和甚高级语言程序进行翻译
C、管理用各种语言编写的源程序
D、管理数据库文件
8.在Windows中,将某个应用程序窗口最小化之后,该应用程序( )。
A、仍在后台运行 B、暂时停止运行 C、完全停止运行 D、出错
9.网络互联实现在更大的范围内传输数据和共享资源,要解决两个问题:一是网络之间要有通信链路,二是提供( )。
A、协议转换功能 B、数据库管理功能 C、安全保密功能 D、信息传输功能
10.Internet网是目前世界上第一大互联网,它起源于美国,其雏形是( )。
A、NCFC B、CERNET C、GBNET D、ARPANET E、CSTNET
11.下列无符号数中,最小的是( )。
A、(11111010110)2 B、(3730)8 C、(2007)10 D、(7D9)16
12.已知集合A={1,2,3,4,5,6,7,8},则A的不含2和4的非空子集的个数为( )。
A、255 B、127 C、63 D、31 E、15
13.C语言中,如果整型变量a=125,则执行操作a>>=2;之后,a的值是( )。
A、1000 B、123 C、127 D、31 E、32
14.对于栈来说,若进栈序列为1、2、3、4、5、6,进栈过程中可以出栈,则下列出栈序列中不可能的是。( )。
A、134256 B、243165 C、345621 D、145623 E、132465
15.一棵完全二叉树的结点总数为18,其叶结点数为( )。
A、7个 B、8个 C、9个 D、10个 E、11个
16.设G是一个非连通无向图,共有28条边,则该图至少有( )个顶点。
A、8 B、9 C、10 D、6
17.对于一个无向带权图G=(V,E),其中V={a,b,c,d,e},E={(a,b),(a,c),(b,d),(c,d),(e,d),(c,e), (a,d),(b,e)},E中边的权值分别为{1,4,2,5,3,1,2,3},则其最小生成树上各边的权值之和为( )。
A、6 B、7 C、8 D、9
18.如右所示的有向无环图,对该图进行拓朴排序,得到
的顶点序列正确的是( )。
A、1,2,5,3,4,6,8,7
B、1,3,6,5,2,8,7,4
C、1,2,3,4,5,6,7,8
D、1,3,2,4,5,7,8,6
19.给出一组数据:10、18、3、4、9、13、15、2、21、9、8,将它们生成一棵二叉排序树,所需要的关键码的比较次数为( )。
A、25 B、24 C、23 D、22
20.对给定的整数序列(541,132,984,746,518,181,946,314,205,827)进行从小到大的排序时,采用快速排序(以中间元素518为基准)的第一趟扫描结果是( )。
A、(181,132,314,205,541,518,946,827,746,984)
B、(205,132,314,181,518,746,946,984,541,827)
C、(541,132,827,746,518,181,946,314,205,984)
D、(541,132,984,746,827,181,946,314,205,518)
二、问题求解(每题5分,共10分)
1.在1,2,3,4中任取2个数,同时要求这两个数不相邻,有3种选取方法:1,3;1,4;2,4。那么在1~9共9个数中,任取3个数,同时要求这4个数中没有相邻的数,它的选取方法有 种。
2.下面一个街区,纵向街道m条,横向街道n条,设A点坐标为(1,1),则B点坐标为(m,n),当中有一点C,其坐标为(i,j)。某人从A点走到对角B点,要求必须向上或向右走,则经过其中的C点的走法一共有 种。
三、阅读程序(每题8分,共32分)
1.#include <stdio.h>
main(){
int a,b,c,x,y,z,u[4];
scanf("%d%d%d%d",&u[0],&u[1],&u[2],&u[3]);
a=u[0]+u[1]+u[2]+u[3]-8;
b=u[0]*(u[1]+u[2]/u[3]-a);
c=u[0]*u[1]/u[2]*u[3];
x=(a+b+c)*3-u[3*c/4];
y=(a*b*c-13)/(u[b/3]*5);
if ((x+y)%2==0) z=(a+b+c+x+y)/2;
else z=(a+b+c-x-y)/2;
printf("%d\n",x-y+z);
}
输入:2 5 7 4
2.#include <stdio.h>
main(){
int hi,lo,m,n;
scanf("%d%d",&m,&n);
hi=0; lo=0;
do{
n--; lo+=m;
if (lo>=10000) { lo-=10000; hi++; }
} while (n!=0);
printf("%4d,%4d\n",hi,lo);
}
输入:345 208
输出:
3.#include <stdio.h>
main(){
int i,j,p,n,q,s,a[21];
scanf("%d%d%d",&p,&n,&q);
j=21;
while (n>0){
j--; a[j]=n%10; n/=10;
}
s=0;
for (i=j;i<=20;i++)
s=s*p+a[i];
printf("%d\n",s);
j=21;
while (s>0){
j--; a[j]=s%q; s/=q;
}
for (i=j;i<=20;i++)
printf("%d",a[i]);
}
输入:7 3051 8
输出:
4.#include <stdio.h>
#include <string.h>
main(){
int n,m,i,j;
char x,st[10],a[10][10];
scanf("%s",st);
n=strlen(st);m=n/2;
for (i=0;i<n;i++)
for (j=0;j<n;j++) a[i][j]=' ';
for (i=0;i<=m;i++)
for (j=i;j<n-i;j++){
x=st[j];
a[i][j]=a[n-i-1][n-j-1]=x;
}
for (j=n-1;j>=0;j--){
for (i=0;i<n;i++)
printf("%2c",a[i][j]);
printf("\n");
}
}
输入:ACEGIKM
输出:
四、完善程序(前4空每空3分,后4空,每空4分,共28分)
1、对于给定的一个正整数,从其个位数开始,每隔一位取一个数字(即取其个位、百位、万位等数字),形成一个新的整数并输出。例如:运行时若输入“14251382”,则输出的整数为“4532”。
请完善下列程序:
#include <stdio.h>
main(){
long n,num;
int i,k;
scanf(“%d”,&n);
k=1; num=0;
for (i=1;n>0;i++){
if ①
{
num=num+ ② ;
k=k*10;
}
③ ;
}
printf(“%d\n”,num);
}
2、设某城市有 n 个车站,并有 m 条公交线路连接这些车站,设这些公交车都是单向的,这 n 个车站被顺序编号为0 至 n-1 。本程序,输入该城市的公交线路数、车站个数, 以及各公交线路上的各站编号,求得从站0出发乘公交 车至站 n-1 的最少换车次数。
程序利用输入信息构建一张有向图 G (用邻接矩阵 g 表示),有向图的顶点是车站,若有某条公交线路经 i 站能到达 j 站,就在顶点 i 到顶点 j 之间设置一条权为 1 的有向边<i,j>。如是这样,从站点 x 至站点 y 的最少上车次数便对应图 G 中从点 x 至点 y 的最短路径长度。而程序要求的换车次数就是上车次数减 1 。
程序的输入格式:
第一行为两个整数m和n,分别表示公交线路数和公交站数。
接下来m行数据,每一行为沿第m条公交车线路前进方向的各站编号dd(0<=dd<n),每行数字以-1结束。
请完善下面的程序:
#include <stdio.h>
#define M 20
#define N 50
int a[N+1]; /*用于存放一条线路上的各站编号*/
int g[N][N]; /*存储对应的邻接矩阵*/
int dist[N]; /*存储站0到各站的最短路径*/
int m,n;
void buildG(){
int i,j,k,sc,dd;
scanf("%d%d",&m,&n);
for (i=0; i<n; i++)
for (j=0; j<n; j++) g[i][j]=0;
for (i=0; i<m; i++){
sc=0;
while (1){
scanf("%d", &dd);
if (dd==-1) break;
if (dd>=0 && dd<n) ④ ;
}
a[sc]=-1;
for (k=1; a[k]>=0; k++)
for (j=0; j<k; j++)
g ⑤ =1;
}
}
int minLen(){
int j,k;
for (j=0; j<n; j++) dist[j]=g[0][j];
dist[0]=1;
do {
for (k=-1, j=0 ; j<n; j++)
if (dist[j] > 0 && (k == -1 || dist[j] < dist[k]))
k = j;
if (k<0 || k==n-1) break;
dist[k]=-dist[k];
for (j=1; j<n; j++)
if ( ⑥ && (dist[j]==0 || -dist[k]+1<dist[j]) )
⑦ ;
} while (1);
j = dist [n-1];
return ⑧ ;
}
main ( ){
int t;
buildG();
if ((t=minLen())<0) printf("No answer!\n");
else printf("%d\n",n-1,t);
}
参考答案
一、
1、B 2、C 3、C 4、B 5、A 6、D 7、A 8、A 9、A 10、D
11、C 12、C 13、D 14、D 15、C 16、B 17、B 18、C 19、D 20、B
二、
1、41
2、
三、
1、18
2、7,1760
3、1065
2051
4、(注:每相邻的两个字符之间空1格)
M A
K K C C
I I I E E E
G G G G G G G
E E E I I I
C C K K
A M
四、
1、
①(i%2==1)
②(n%10)*k
③n=n/10
2、
④a[sc++]=dd
⑤[a[j]][a[k]]
⑥dist[j]>=0 && g[k][j]==1
⑦-dist[k]+1
⑧k<0 ? -1 : j-1
D. 第十九届全国青少年信息学奥林匹克联赛普及组C语言试题 答案
E. 求第十四届信息学奥赛联赛普及组c语言初赛试题 第三大题第4题解析 详细点
知道前序遍历和中序遍历,求后序遍历,这就是程序的目的
F. NOIP2007普及组初赛答案(C语言)
这个比赛是哪的?
G. 第十六届全国青少年信息学奥林匹克联赛普及组和提高组试题答案(C语言)
答案在 http://10.0.248.2/blog/u/42/3649.html
H. 急需 第二十届全国青少年信息学奥林匹克联赛(CCF NOIP2014初赛普及组c语言试题)初
第二十届全国青少年信息学奥林匹克联赛后天才进行比赛,可以参考往届的试题来复习
I. 求试题,17届NOIP(C语言)普及组初赛试题
一、单项选择题(共20题,每题1.5分,共计30分。每题有且仅有一个正确选项。)
1.在二进制下,1101001 + ( ) = 1110110。
A. 1011 B. 1101 C. 1010 D. 1111
2.字符“0”的ASCII码为48,则字符“9”的ASCII码为( )。
A. 39 B. 57 C. 120 D. 视具体的计算机而定
3.一片容量为8GB的SD卡能存储大约( )张大小为2MB的数码照片。
A. 1600 B. 2000 C. 4000 D. 16000
4.摩尔定律(Moore's law)是由英特尔创始人之一戈登•摩尔(Gordon Moore)提出来的。根据摩尔定律,在过去几十年以及在可预测的未来几年,单块集成电路的集成度大约每( )个月翻一番。
A. 1 B. 6 C. 18 D. 36
5.无向完全图是图中每对顶点之间都恰有一条边的简单图。已知无向完全图G有7个顶点,则它共有( )条边。
A. 7 B. 21 C. 42 D. 49
6.寄存器是( )的重要组成部分。
A. 硬盘 B. 高速缓存 C. 内存 D. 中央处理器(CPU)
7.如果根结点的深度记为1,则一棵恰有2011个叶结点的二叉树的深度最少是( )。
A. 10 B. 11 C. 12 D. 13
8. 体育课的铃声响了,同学们都陆续地奔向操场,按老师的要求从高到矮站成一排。每个同学按顺序来到操场时,都从排尾走向排头,找到第一个比自己高的同学,并站在他的后面。这种站队的方法类似于( )算法 。
A. 快速排序 B. 插入排序 C. 冒泡排序 D. 归并排序
9.一个正整数在二进制下有100位,则它在十六进制下有( )位。
A. 7 B. 13 C. 25 D. 不能确定
10.有人认为,在个人电脑送修前,将文件放入回收站中就是已经将其删除了。这种想法是( )。
A. 正确的,将文件放入回收站意味着彻底删除、无法恢复
B. 不正确的,只有将回收站清空后,才意味着彻底删除、无法恢复
C. 不正确的,即使将回收站清空,文件只是被标记为删除,仍可能通过恢复软件找回
D. 不正确的,只要在硬盘上出现过的文件,永远不可能被彻底删除
11.广度优先搜索时,需要用到的数据结构是( )。
A. 链表 B. 队列 C. 栈 D. 散列表
12.在使用高级语言编写程序时,一般提到的“空间复杂度”中的“空间”是指( )。
A. 程序运行时理论上所占的内存空间
B. 程序运行时理论上所占的数组空间
C. 程序运行时理论上所占的硬盘空间
D. 程序源文件理论上所占的硬盘空间
13.在含有n个元素的双向链表中查询是否存在关键字为k的元素,最坏情况下运行的时间复杂度是( )。
A. O(1) B. O(log n) C. O(n) D. O(n log n)
14.生物特征识别,是利用人体本身的生物特征进行身份认证的一种技术。目前,指纹识别、虹膜识别、人脸识别等技术已广泛应用于政府、银行、安全防卫等领域。以下不属于生物特征识别技术及其应用的是( )。
A. 指静脉验证 B. 步态验证 C. ATM机密码验证 D. 声音验证
15.现有一段文言文,要通过二进制哈夫曼编码进行压缩。简单起见,假设这段文言文只由4个汉字“之”、“乎”、“者”、“也”组成,它们出现的次数分别为700、600、300、200。那么,“也”字的编码长度是( )。
A. 1 B. 2 C. 3 D. 4
16.关于汇编语言,下列说法错误的是( )。
A. 是一种与具体硬件相关的程序设计语言
B. 在编写复杂程序时,相对于高级语言而言代码量较大,且不易调试
C. 可以直接访问寄存器、内存单元、以及I/O端口
D. 随着高级语言的诞生,如今已完全被淘汰,不再使用
17.( )是一种选优搜索法,按选优条件向前搜索,以达到目标。当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择。
A. 回溯法 B. 枚举法 C. 动态规划 D. 贪心法
18.1956年( )授予肖克利(William Shockley)、巴丁(John Bardeen)和布拉顿(Walter Brattain),以表彰他们对半导体的研究和晶体管效应的发现。
A. 诺贝尔物理学奖
B. 约翰•冯•诺依曼奖
C. 图灵奖
D. 高德纳奖(Donald E. Knuth Prize)
19.对一个有向图而言,如果每个节点都存在到达其他任何节点的路径,那么就称它是强连通的。例如,右图就是一个强连通图。事实上,在删掉边( )后,它依然是强连通的。
A. a B. b C. c D. d
20.从ENIAC到当前最先进的计算机,冯•诺依曼体系结构始终占有重要的地位。冯•诺依曼体系结构的核心内容是( )。
A. 采用开关电路 B. 采用半导体器件
C. 采用存储程序和程序控制原理 D. 采用键盘输入
二、问题求解(共2题,每题5分,共计10分)
1.每份考卷都有一个8位二进制序列号。当且仅当一个序列号含有偶数个1时,它才是有效的。例如,00000000、01010011都是有效的序列号,而11111110不是。那么,有效的序列号共有________个。
2.定义字符串的基本操作为:删除一个字符、插入一个字符和将一个字符修改成另一个字符这三种操作。将字符串A变成字符串B的最少操作步数,称为字符串A到字符串B的编辑距离。字符串"ABCDEFG"到字符串"BADECG"的编辑距离为________。
三、阅读程序写结果(共4题,每题8分,共计32分)
1.
#include<stdio.h>
int main() {
int i, n, m, ans;
scanf("%d%d", &n, &m);
i = n;
ans = 0;
while (i <= m) {
ans += i;
i++;
}
printf("%d\n", ans);
return 0;
}
输入:10 20
输出:_________
2.
#include <stdio.h>
#include <string.h>
#define SIZE 20
int main()
{
char map[] = "22233344455566677778889999";
char tel[SIZE];
int i;
scanf("%s", tel);
for (i = 0; i < strlen(tel); i++)
if ((tel[i] >= '0') && (tel[i] <= '9'))
printf("%c", tel[i]);
else if ((tel[i] >= 'A') && (tel[i] <= 'Z'))
printf("%c", map[tel[i] - 'A']);
return 0;
}
输入:CCF-NOIP-2011
输出:_________
3.
#include <stdio.h>
#include <string.h>
#define SIZE 100
int main()
{
int n, i, sum, x, a[SIZE];
scanf("%d", &n);
memset(a, 0, sizeof(a));
for (i = 1; i <= n; i++) {
scanf("%d", &x);
a[x]++;
}
i = 0;
sum = 0;
while (sum < (n / 2 + 1)) {
i++;
sum += a[i];
}
printf("%d\n", i);
return 0;
}
输入:
11
4 5 6 6 4 3 3 2 3 2 1
输出:_________
4.
#include <stdio.h>
int solve(int n, int m)
{
int i, sum;
if (m == 1)
return 1;
sum = 0;
for (i = 1; i < n; i++)
sum += solve(i, m - 1);
return sum;
}
int main()
{
int n, m;
scanf("%d %d", &n, &m);
printf("%d\n", solve(n, m));
return 0;
}
输入:7 4
输出:_________
四、完善程序(前11空,每空2分,后2空,每空3分,共计28分)
1.(子矩阵)输入一个n1*m1的矩阵a,和n2*m2的矩阵b,问a中是否存在子矩阵和b相等。若存在,输出所有子矩阵左上角的坐标;若不存在输出“There is no answer”。
#include <stdio.h>
#define SIZE 50
int n1, m1, n2, m2, a[SIZE][SIZE], b[SIZE][SIZE];
int main()
{
int i, j, k1, k2, good, haveAns;
scanf("%d %d", &n1, &m1);
for (i = 1; i <= n1; i++)
for (j = 1; j <= m1; j++)
scanf("%d", &a[i][j]);
scanf("%d %d", &n2, &m2);
for (i = 1; i <= n2; i++)
for (j = 1; j <= m2; j++)
① ;
haveAns = 0;
for (i = 1; i <= n1 - n2 + 1; i++)
for (j = 1; j <= ② ; j++) {
③ ;
for (k1 = 1; k1 <= n2; k1++)
for (k2 = 1; k2 <= ④ ; k2++) {
if (a[i + k1 - 1][j + k2 - 1] != b[k1][k2])
good = 0;
}
if (good == 1) {
printf("%d %d\n", i, j);
⑤ ;
}
}
if (haveAns == 0)
printf("There is no answer\n");
return 0;
}
2.(大整数开方)输入一个正整数n(1≤n<10100),试用二分法计算它的平方根的整数部分。
#include <stdio.h>
#include <string.h>
#define SIZE 200
typedef struct node {
int len, num[SIZE];
} hugeint;
//其中len表示大整数的位数;num[1]表示个位、num[2]表示十位,以此类推
hugeint times(hugeint a, hugeint b)
//计算大整数a和b的乘积
{
int i, j;
hugeint ans;
memset(ans.num, 0, sizeof(ans.num));
for (i = 1; i <= a.len; i++)
for (j = 1; j <= b.len; j++)
① += a.num[i] * b.num[j];
for (i = 1; i <= a.len + b.len; i++) {
ans.num[i + 1] += ans.num[i] / 10;
② ;
}
if (ans.num[a.len + b.len] > 0)
ans.len = a.len + b.len;
else
ans.len = a.len + b.len - 1;
return ans;
}
hugeint add(hugeint a, hugeint b)
//计算大整数a和b的和
{
int i;
hugeint ans;
memset(ans.num, 0, sizeof(ans.num));
if (a.len > b.len)
ans.len = a.len;
else
ans.len = b.len;
for (i = 1; i <= ans.len; i++) {
ans.num[i] += ③ ;
ans.num[i + 1] += ans.num[i] / 10;
ans.num[i] %= 10;
}
if (ans.num[ans.len + 1] > 0)
ans.len++;
return ans;
}
hugeint average(hugeint a, hugeint b)
//计算大整数a和b的平均数的整数部分
{
int i;
hugeint ans;
ans = add(a, b);
for (i = ans.len; i >= 2; i--) {
ans.num[i - 1] += ( ④ ) * 10;
ans.num[i] /= 2;
}
ans.num[1] /= 2;
if (ans.num[ans.len] == 0)
ans.len--;
return ans;
}
hugeint plustwo(hugeint a)
//计算大整数a加2后的结果
{
int i;
hugeint ans;
ans = a;
ans.num[1] += 2;
i = 1;
while ((i <= ans.len) && (ans.num[i] >= 10)) {
ans.num[i + 1] += ans.num[i] / 10;
ans.num[i] %= 10;
i++;
}
if (ans.num[ans.len + 1] > 0)
⑤ ;
return ans;
}
int over(hugeint a, hugeint b)
//若大整数a>b则返回1,否则返回0
{
int i;
if ( ⑥ )
return 0;
if (a.len > b.len)
return 1;
for (i = a.len; i >= 1; i--) {
if (a.num[i] < b.num[i])
return 0;
if (a.num[i] > b.num[i])
return 1;
}
return 0;
}
int main()
{
char s[SIZE];
int i;
hugeint target, left, middle, right;
scanf("%s", s);
memset(target.num, 0, sizeof(target.num));
target.len = strlen(s);
for (i = 1; i <= target.len; i++)
target.num[i] = s[target.len - i] - ⑦ ;
memset(left.num, 0, sizeof(left.num));
left.len = 1;
left.num[1] = 1;
right = target;
do {
middle = average(left, right);
if (over( ⑧ ) == 1)
right = middle;
else
left = middle;
} while (over(plustwo(left), right) == 0);
for (i = left.len; i >= 1; i--)
printf("%d", left.num[i]);
printf("\n");
return 0;
}