第十二届全国青少年信息学奥林匹克联赛初赛试题

 

 

普及  C++      二小时完

OIFans.cn整理收集

 

 

  部试答案均要求写在答卷纸上,写在试卷纸上一律无      ●●

 

 

 

 

单项选择 20 题,每 1.5 分,共 30 分。每题有且仅有一个正确答.OIFans.cn收集

 

 

1.在下面世界顶级的项中为计机科学与技领域做出杰贡献的科学设立的奖项           

 

   A.          B.    诺贝尔         C. 菲尔兹        D. 图灵奖

 

 

2. 在下列软件中,不 NOIP (复赛)推使用的语言境有         

 

A. gcc/g++                     B. Turbo Pascal

 

C. RHIDE                       D. free pascal

 

 

3. 以下断之后仍能保数据的有      )。

 

A. 寄存         B. ROM          C. RAM         D. 缓存

 

 

4Linux (     )

 

A. 绘图软       B. 程序设计语言  C. 操作系           D. 网络浏览器

 

 

5. CPU (   )的简称。

 

A.            B. 中央处理       C. 高级程序语言   D. 核心寄存器

 

 

6在计算机中,防火的作用是      

 

A. 防止火               B.防止网络攻击

 

C. 防止计机死             D. 防止使用者删除数据

 OIFans.cn收集

 

7. 在下列于计算机语的说法中,正确的是       )。

 

A. PascalC都是编执行的高级

 

B. 高级语程序比汇编言程序更容从一种计算移植到另一计算机上

 

C. C++史上的第一支持面向对的计算机语言

 

D. 与汇编言相比,高语言程序更易阅读

 

 

8. 在下列于计算机算的说法中,正确的是       )。

 

A. 一个正的算法至少有一个输入

 

B. 算法的进,在很大度上推动了算机科学与术的进步

 

C. 判断一算法的好坏主要标准是法的时间复性与空间复

D. 目前仍存在许多涉到国计民生重大课题,没有找到能在计算机上施的有效算法

 

 

9. 在下列种排序算法,不是以“较”作为主操作的算法        )。

 

A. 选择排         B. 冒泡排           C. 入排           D. 基数排序

 

 

10.在编时(使用任种高级语言不一定 C++,如从磁盘文件输入一个很的二维数 组(例 1000*1000 double ,按行读(即外层循是关于行的与按列读(外层循环 是关于列的相比,在输效率上   

 

A. 没有区                  B. 按行读的方式高一些OIFans.cn收集

 

C. 按列读方式要高一        D. 取决于数组的储方式。

 

 

11 C++ 中,表达 21^2 的值是       

 

 A. 441          B. 42           C.23          D.24

 

 

12 C++ 中,判 a 0 b 不等 0 确的条件表式是           

A. !a==0 || !b==0             B. !((a==0)&&(b==0)) C. !(a==0&&b==0)       D. a && b

 

 

13某个车呈狭长形度只能容下台车并且有一个出入已知某时该车站状态这一时刻开始的出入记录为“进,出进,进,进出,出,进进,进,出,。假设辆入站的 顺序 123,……则车辆出站顺序为

 

A. 1, 2, 3, 4, 5           B. 1, 2, 4, 5, 7

 

C. 1, 4, 3, 7, 6           D. 1, 4, 3, 7, 2

 

 

14高度 n 的均衡的叉树是指果去掉叶结及相应的树它应该是高 n-1 满二叉树。 在这里,树等于叶结点最大深度,结点的深 0,如果某个均衡的二树共 2381 个结点, 则该树的树 

 

A. 10         B. 11              C. 12              D. 13OIFans.cn收集

 

 

15. 与十 1770 对应的八进制      

 

A. 3350         B. 3351             C. 3352      D. 3540

 

 

16 5 的序列排不论原先的序如何最少都可以通         次比较完成从小到的排序。

 

A. 6             B. 7              C. 8            D. 9

 

 

 

 

17. A=B=D=trueC=false,以逻辑运算表式值为真的          )。


 

A. (¬ AB)(CD)            B.¬ ((ABD)C)

C.   ¬ A(BCD)            D. (ABC)¬ D

 

 

18.  (2010)16 + (32)8的结果是       

 

A. (8234)10                     B. (202B)16

 

  C. (20056)8                   D. (100000000110)2

 

 

19. 设栈S初始状态为,元素a, b, c, d, e 依次入栈,下出栈序列可能出现的            )。

 

A. a, b, c, e, d             B. b, c, a, e, dOIFans.cn收集

 

C. a, e, c, b, d           D. d, c, e, b, a

 

 

20. 6 个结点的二树的先根遍 1 2 3 4 5 6(数字结点的编号以下同,后根遍历是

 

3 2 5 6 4 1,则该二树的可能的根遍历是       

 

A. 3 2 1 4 6 5            B. 3 2 1 5 4 6

 

C. 2 1 3 5 4 6            D. 2 3 1 4 6 5

 

 

二.问题求解( 2 题,每 5 分,共 10 分)

 

 

1(寻找假币 80 枚硬币有一枚是假其重量稍所有真币重量都相同如果使 用不带砝码天平称重少需要称几就可以找出假币?你还指出 1 称重方法写出你的 结果:_________________________________________________

 

 

2(取石子游戏 5 堆石子,数依次 3571950,甲乙两轮流从任一中任取

(每次只能自一堆,不不取, 取最后一颗石子一方获胜。先取,问甲没有获胜策(即无论 乙怎样取,只要不失误都能获胜)如果有,甲一步应该在一堆里取多?请写出你结果:OIFans.cn收集

 

_________________________________________________

 

 

三.阅读程序写结果( 4 题,每 8 分,共 32 分)

 

 

1. #include <iostream.h>

 

void main()

 

{int i,u[4],a,b,x,y=10;

 

  for(i=0;i<=3;i++)

 

 cin >>u[i];

 

  a=(u[0]+u[1]+u[2]+u[3])/7;

 

  b=u[0]/((u[1]-u[2])/u[3]);

 

  x=(u[0]+a+2)-u[(u[3]+3)%4];

 

  if(x>10)

 

 y+= (b*100-u[3])/(u[u[0]%3]*5);


 

  else

 

 y+=20+(b*100-u[3])/(u[u[0]%3]*5);

 

  cout <<x<<","<<y<<endl;

 } //   注:本例中,给的输入数据以避免分 0 或下标界。 输入:9 3 9 4

 

输出:_______________

 

 

 

2.#include <iostream.h>

 

void main()

 

{int i,j,m[]={2,3,5,7,13};

 

long t;

 

for (i=0;i<=4;i++)

 

  {t=1;

 

   for(j=1;j<m[i];j++)   t*=2;OIFans.cn收集

 

   cout <<(t*2-1)*t<<"   ";

 

  }

 

cout <<endl;

 

}

 

输出:____________________

 

 

 

3. #include "iostream.h"

 

#define N    7

 

int fun(char s[],char a,int n)

 

 {int j;

 

  j=n;

 

while(a<s[j] && j>0) j--;

 

  return j;

 

 }

 

void main()

 

 {char s[N+1];

 

  int k;

 

  for(k=1;k<=N;k++)

 

 s[k]='A'+2*k+1;

 

  cout <<fun(s,'M',N)<<endl;

 

 }

 

输出:_____________

 

 

 

4. #include <iostream.h>

 


 

#include <iomanip.h>

 

void digit(long n,long m)

 

  {if(m>0)

 

   cout <<setw(2)<<n%10;

 

   if(m>1)

 

   digit(n/10,m/10);

 

   cout <<setw(2)<<n%10;

 

  }

 

void main()

 

 {long x,x2;

 

cout <<"Input a number:"<<endl;

 

  cin >>x;

 

  x2=1;

 

  while(x2<x)  x2*=10;

 

  x2/=10;

 

  digit(x,x2);

 

  cout <<endl;

 

 }

 

输入:9734526

 

输出:______________________________

 

 

四.完善程序 ( 4 空,每 2.5 分, 6 空,每 3 分, 28 )OIFans.cn收集

 

 

1(全排列)下面程序的能是利用递方法生成 1 n(n<10) n 个数的全部可能的排(不一 定按升序输。例如,输 3,则应输出(每行 5 个排列

 

123 132 213     231 321

 

312

 

程序:

 

#include <iostream.h>

 

#include <iomanip.h>

 

int n,a[10];  // a[1],a[2],,a[n] n 个数的一个

 

long count=0;  // count 录不同排列个数,这里于控制换行

 

void perm(int k)

 

{int j,p,t;

 

if(      )

 

  {count++;

 

   for(p=1;p<=n;p++)

 

 cout <<setw(1)<<a[p];


 

   cout <<"  ";

 

   if(        )  cout <<endl;

 

 return;

 

   }

 

 for(j=k;j<=n;j++)

 

   {t=a[k];a[k]=a[j];a[j]=t;

 

   ;

 

   t=a[k];         ;

 

   }

 

 }

 

void main()

 

{int i;

 

  cout <<"Entry n:"<<endl;

 

  cin >>n;

 

  for(i=1;i<=n;i++)  a[i]=i;

 

    ;

 

}

 

 

2键盘 P (P<100,000,000) 5 S使 P×S =

 

1111...1 ( 在给定的件下,解 S 必存在)求在屏幕上次输出以下:

1S 部数字。除后一行外,行输 50 位数字 2 乘积的字位数。 1:输 p=13,由 13*8547=111111,则应输出(1854726 2:输 p=147,则出结果应为1755857898715041572184429327286470143613

 

242等式的右 42 1OIFans.cn收集

 

 

程序:

 

#include <iostream.h>

 

#include <iomanip.h>

 

void main()

 

 {long p,a,b,c,t,n;

 

  while (1)

 

 { cout <<"输入 p, 最后一位为 1 3 7 9:"<<endl;

 

   cin >>p;

 

   if ((p%2!=0)&&(p%5!=0))  // 如果输的数符合要,结束循环

 

   ;

 

  }

 

   a=0; n=0;

 

   while (a<p)

 


 

   {a=a*10+1; n++; // a 存放部分右端n 为右端的位数

 

 }

 

   t=0;

 

   do

 

 {b=a/p;

 

  cout <<setw(1)<<b;

 

  t++;

 

  if (      )

 

  cout <<endl;OIFans.cn收集

 

 c=      ;  a=        ; n++;

 

} while (c>0);

 

   cout<<endl<<"n="<<            <<endl;

 

 }