资源描述
全国青少年信息学奥林匹克联赛初赛模拟试题
姓名 成绩
一、 单项选择题 (共20 题,每题1.5 分,共计30 分。每题有且仅有一个正确答案.)。
1. 在以下各项中,( )是CPU 的组成部分。
A. Cache B. RAM C. 寄存器 D. 主板
2.SQL语言又称为( )
A. 结构化定义语言 B. 结构化控制语言 C. 结构化查询语言 D. 结构化操纵语言
3.计算机运算速度的单位是( )
A、MTBF B、MIPS C、MHZ D、MB
4.下面是关于微处理器MPU的描述,不正确的是( ) 。
A.微处理器是微型计算机的核心部件
B.微处理器是一块包含运算器和控制器的大规模集成电路芯片
C.微处理器的性能决定了微型计算机的档次
D.我们在购买微型计算机时,应该不断跟踪微处理器的更新
5. 某机字长8位,采用补码形式(其中1位为符号位),则机器数所能表示的范围是( )
A.-127 ~ 127 B.-128 ~ +128 C.-128 ~ +127 D.-128 ~ +128。
6.某计算机字长32位,其存储容量为4MB,若按字编址,它的寻址范围是 ( )。
A、0~1M B、0~4MB C、0~4M D、0~1MB
7.栈底至栈顶依次存放元素A、B、C、D,在第五个元素E入栈前,栈中元素可以出栈,则出栈序列可能是( )
A. ABCED B. DBCEA C. CDABE D. DCBEA。
8. 冗余数据是指可以由其他数据导出的数据,下述关于数据库系统的叙述中正确的是( )
A. 数据库系统减少了数据冗余 B. 数据库系统避免了一切冗余
C. 数据库系统中数据的一致性是指数据类型的一致
D. 数据库系统比文件系统能管理更多的数据
9. 办公自动化(OA)是目前广泛开展的一项计算机应用,按分类,它应属于( )
A.实时控制 B. 科学计算 C. 数据处理 D.计算机辅助设计
10. 结构化程序设计主要强调的是( )
A.程序的规模 B.程序的易读性 C.程序的执行效率 D.程序的可移植性
11. 用树形结构来表示实体之间联系的模型称为( )
A. 关系模型 B. 层次模型 C. 网状模型 D. 数据模型
12. 面向对象的设计方法与传统的的面向过程的方法有本质不同,它的基本原理是( )
A. 模拟现实世界中不同事物之间的联系
B. 强调模拟现实世界中的算法而不强调概念
C. 使用现实世界的概念抽象地思考问题从而自然地解决问题
D. 鼓励开发者在软件开发的绝大部分中都用实际领域的概念去思考
13.以下对计算机的产生有重要影响的人物是( )。
A.牛顿、维纳、图灵 B.莱布尼兹、布尔、图灵
C.巴贝奇、维纳、麦克斯韦 D. 莱布尼兹、布尔、克雷
14.在C 语言中,表达式23&2^5 的值是( )
A. 5 B. 6 C.7 D. 8
15.某二叉树的前序遍历结点访问顺序是abdgcefh,中序遍历的结点访问顺序是dgbaechf,则其后序遍历的结点访问顺序是( )
A. bdgcefha B.gdbecfha C. bdgaechf D.gdbehfca
16.二维数组A的每个元素是由6个字符组成的串。其行下标从0到8,其列小标从0到9,若按行优先存储,元素A[7][4]的起始地址与当A按列优先存储时( )的起始地址相同,设每个字符占一个字节。
A. A[2][8] B. A[3][9] C. A[5][7] D. A[0][8]
17. 一个8位二进制整数,采用补码表示,且有3个“1”和5个“0”组成,则最小值为( )
A. -127 B.-32 C. -125 D.-3
18. 设A=B=true,C=D=false,以下逻辑运算表达式值为真的有( )。
A. (¬ A∧B)∨(C∧D∨¬A) B. ¬ (((A∧B)∨C)∧D)
C. A∧ ¬(B∨C∨D)∨D D. (A∧(D∨C)) ∧B
19. (3C7E)16 + (37)8 的结果是( )。
A. (15519)10 B. (3C9D)16 C. (1100000110111)2 D. (17357)8
20. 已知一棵完全二叉树的叶子结点172个其结点总数为( )
A. 304 B. 343 C. 342 D. 341
二.问题求解(共2 题,每题5 分,共计10 分)
1.有相同外形和颜色的10堆球,同一堆球中每个重量相同,每堆10个,其中9堆100斤,1堆90斤。问如何称一次找出90斤的那堆球。 写出方法和算式。
2.从1到9中取7个不同数字组成7位数,如果不允许5与6相邻,有多少种方法。
三.阅读程序写结果(共4 题,每题8 分,共计32 分)
1. #include<stdio.h>
int fun(int *s,int n1,int n2)
{ int i,j;
i=n1;j=n2;
while(i<j)
{*(s+i)+=*(s+j);
*(s+j)+=*(s+i);
i++;j--;
}
}
int main()
{int a[6]={1,2,3,4,5,6},i,*p=a;
fun (p,0,3);
fun(p,1,4);
fun(p,3,5);
for(i=0;i<6;i++)
printf("%d",*(a+i));
printf("\n");
}
输出:
2.#include "string.h"
#include "stdio.h"
int strle(char a[],char b[])
{ int num=0,n=0;
while(*(a+num)!='\0') num++;
while(b[n]){ *(a+num)=b[n];num++;n++;}
return (num);}
int main()
{ char str1[81],str2[81],*p1=str1,*p2=str2;
gets(p1); gets(p2);
printf("%d\n",strle(p1,p2));
while(1);
}
输入:yruyrruyeterrrrr
uitryuii
输出:
3. #include<stdio.h>
void ive(int x[],int n)
{ int t,*p;
p=x+n-1;
while(x<p)
{ t=*x;
*x++=*p;
*p--=t;
}
}
int main()
{ int i,a[]={1,3,11,4,7,6,5,9,8,0};
ive(a,10);
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
while(1);
}
输出:
4、#include<stdio.h>
int main()
{ int k=0;
char c='A';
do
{ switch(c++)
{ case 'A': k++;break;
case 'B': k--;
case 'C': k+=2;break;
case 'D': k=k%2;continue;
case 'E': k=k+10;break;
default: k=k/3;
}
k++;
}while(c<’C’) ;
printf("k=%d\n",k);
while(1);
}
输出:
四.完善程序 (前4 空,每空2.5 分,后6 空,每空3 分,共28 分)
1. 输入n组数,每组2个整数,将每组数的逆序和的逆序按习惯输出
#include<stdio.h>
#include<string.h>
int print(int n)
{ int i,j,m[n],b[n][20],max,s,sum[n];
char str1[n][20],str2[n][20];
for(i=0;i<n;i++)
for(j=0;j<20;j++)
b[i][j]=0;
for(i=0;i<n;i++)
{scanf("%s %s",str1[i],str2[i]); getchar(); }
for(i=0;i<n;i++)
{ m[i]=strlen(str1[i]);
if(m[i]<strlen(str2[i]))
m[i]=strlen(str2[i]);
s= ;
for(j=0;j<m[i];j++)
{ if(str1[i][j]!='\0' ) {b[i][j]=str1[i][j]-48+s;s=0;}
if( ) { ;}
if(b[i][j]>9)
{ s=b[i][j]/10; ; }
else s=0;
}
if(s!=0)
{m[i]++;b[i][j]=s;}
}
for(i=0;i<n;i++)
{s=0;
for(j=0;j<m[i];j++)
{ if(b[i][j]==0)
{ if(s==1)
printf("%d",b[i][j]);
else s=0;
}
else {s=1;printf("%d",b[i][j]);}
}
printf("\n");
}
return 0;
}
int main()
{ int n;
scanf("%d",&n);
print(n);
while(1);
return 0;
}34
1998
1
输入:3 输出:
24 1
4358 754
305 794
2.在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数。
如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的。 对于一个分数a/b,表示方法有很多种,但是哪种最好呢? 首先,加数少的比加数多的好,其次,加数个数相同的,最小的分数越大越好。如: 19/45=1/3 + 1/12 + 1/180 19/45=1/3 + 1/15 + 1/45 19/45=1/3 + 1/18 + 1/30,
19/45=1/4 + 1/6 + 1/180 19/45=1/5 + 1/6 + 1/18.
最好的是最后一种,因为1/18比1/180,1/45,1/30,1/180都大。 给出a,b(0<a<b<1000),编程计算最好的表达方式。
Input:第一行:N 表示有N组测试数据,每组测试数据为一行包含a,b(0<a<b<1000)。
Output:每组测试数据若干个数,自小到大排列,依次是单位分数的分母。
Sample Input
1
19 45
Sample Output
5 6 18
#include<stdio.h>
using namespace std;
long long a,b,best,ans[100001],mark,limt,way[100001];
void dfs(long long x,long long y,long long deep)
{ long long l1,l2,i,xx,yy,j;
l1=max(way[deep-1]+1, );
l2=min(y*(limt-deep+1)/x, );
for (i=l1;i<=l2;i++)
{ xx= x ;yy=y ;
way[deep]=i;
xx= ;
if (x<0)continue;
yy=yy*i;
if ( deep<limt )dfs(xx,yy,deep+1);
if ( )
{
mark=1;best=i;
for (j=1;j<=limt;j++)
ans[j]=way[j];
}
}
}
void work()
{ long long i;
mark=0;way[0]=1;best=99999999;
while(mark= =0)
{ ;
;
}
for (i=1;i<=limt;i++)
printf(“%d “,ans[i]);
}
int main()
{ Scanf(“%d %d”,&a,&b);
work();
}
参考答案:
一.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
C C B D C A D A C B B C B C D A C B B B
二.1) 550-x 2)a(9,7)-a(2,2)*a(6,6)*c(7,5)=12500
三.1.51017321538
2.24
3.0 8 9 5 6 7 4 11 31
4,k=4
四.
1.0 2. Str2[i][j]!=’\0’ 3.B[i][j]+=str2[i][j]-48;s=0; 4.B[i][j]%=10
1.y/x 2. best-1 3. xx*i-yy 4. (i<best&&xx==0) 5. limb++ 6.dfs(a,b,1)
#include<stdio.h>
#include<string.h>
int print(int n)
{ int i,j,m[n],b[n][20],max,s,sum[n];
char str1[n][20],str2[n][20];
for(i=0;i<n;i++)
for(j=0;j<20;j++)
b[i][j]=0;
for(i=0;i<n;i++)
{scanf("%s %s",str1[i],str2[i]); getchar(); }
for(i=0;i<n;i++)
{ m[i]=strlen(str1[i]);
if(m[i]<strlen(str2[i]))
m[i]=strlen(str2[i]);
s=0; ;
for(j=0;j<m[i];j++)
{ if(str1[i][j]!='\0' ) {b[i][j]=str1[i][j]-48+s;s=0;}
if(str2[i][j]!='\0') {b[i][j]+=str2[i][j]-48;s=0;} ;
if(b[i][j]>9)
{ s=b[i][j]/10; b[i][j]%=10; }
else s=0;
}
if(s!=0)
{m[i]++;b[i][j]=s;}
}
for(i=0;i<n;i++)
{s=0;
for(j=0;j<m[i];j++)
{ if(b[i][j]==0)
{ if(s==1)
printf("%d",b[i][j]);
else s=0;
}
else {s=1;printf("%d",b[i][j]);}
}
printf("\n");
}
return 0;
}
int main()
{ int n;
scanf("%d",&n);
print(n);
while(1);
return 0;
}
#include<fstream>//埃及分数
using namespace std;
ifstream fin("ajfs.in");
ofstream fout("ajfs.out");
long long a,b,best,ans[100001],mark,limt,way[100001];
void dfs(long long x,long long y,long long deep)
{ long long l1,l2,i,xx,yy,j;
l1=max(way[deep-1]+1,y/x);
l2=min(y*(limt-deep+1)/x,best-1);
for (i=l1;i<=l2;i++)
{ xx=x;yy=y;
way[deep]=i;
xx=xx*i-yy;
if (x<0)continue;
yy=yy*i;
if ( deep<limt )dfs(xx,yy,deep+1);
if ( i<best && xx==0 )
{ mark=1;best=i;
for (j=1;j<=limt;j++)
ans[j]=way[j];
}
}
}
void work()
{ long long i;
mark=0;way[0]=1;best=99999999;
while(mark==0)
{ limt++; dfs(a,b,1); }
for (i=1;i<=limt;i++)
fout<<ans[i]<<" ";
}
main()
{ fin>>a>>b; work();
}
展开阅读全文