NOIP初赛模拟赛试题211
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
NOIP初赛模拟赛试题
一、单项选择题(共 10 题,每题 1.5 分,共计 15 分。
每题有且仅有一个正确答案)
1.运算器的主要功能是( B )。
A.控制计算机各部件协同工作并进行运算
B.进行算术运算和逻辑运算
C.控制输入输出数据
D.进行运算并存储结果
E.进行运算并存取结果
2.我们常用的CD-ROM的准确含义是( A )。
A. 只读光盘
B.可擦写光盘
C.光盘驱动器
D.文件式存储盘
E.音乐CD唱机
3.下面( D )不是开源软件Linux众多的发行版之一。
A. Fedora
B. Red hat AS
C.Ubuntu
D. Netware
E. 红旗桌面
4.设栈S和队列Q的初始状态为空,元素a1、a2、a3、a4、a5、a6依次通过栈S,一个元素出栈后即进入队列Q,若6个元素出队的序列是a2、a4、a3、a6、a5、a1,则栈S的容量至少有( C )。
A.2
B.3
C.4
D.5
E.6
5.在C语言中,表达式(25 | 31)的值是( E )。
A.6
B. 775
C.-7
D. 25
E. 31
6.在C语言中,表达式(5 + 6 % 4 / 2)的值是( B )。
A.1
B.5
C.6
D.17
E.此表达式错误,无输出值
7.在二叉树中,若一棵二叉树至多只有最下面的两层上结点的度数可以小于2,并且最下一层上的结点都集中在该层最左边的若干位置上,则我们称此二叉树称为完全二叉树。
现在将有关二叉树的概念推广到三叉数,则一棵有244个结点的完全三叉数的高度是( A )。
A.4
B.5
C.6
D.7
E.8
8.如果一个连通无向图具有n个顶点,那么它至少有( E )条边。
A.n-1
B.n
C.n+1
D.nlon2n
E.1/2*n(n-1)
9.2007年初,( E )击败了戴尔,在全球PC厂商市场占有率排行榜上名列第一。
A.联想
B.英特尔
C. 宏碁
D.华硕
E.惠普
10.八进制数133.64用十进制数表示的结果是( B
A.91.52
B.85.416
C.85.52
D.91.8125
E.1011011.110101
二、多项选择题(共 10 题,每题 1.5 分,共计 15 分。
每题正确答案的个数大于或等于 1。
多选或少选均不得分)
11.在现行的IPv4标准中,下列符合公网IP地址标准的是( ACD )。
A.60.213.14.35
B.192.168.0.3
C. 222.223.228.135
D.
219.137.239.256
12.在C语言中,下列不符合标准的用户自定义标识符是( CDA )。
A. return
B. name (5)
+5
D.5name
13.(2007)8 + (7EC)16的结果是( ABCD )。
A.(101111110011)2
B.(5763)8
C.(3059)10
D.(BF3)16
14.若S是一个大小为4的栈,若元素1,2,3,4,5,6,7按顺序依次进栈,则这7个元素的出栈顺序可能为( ABCD )。
A.1,2,3,4,5,6,7
B.1,4,3,5,7,2,6
C.1,3,2,4,7,5,6
D.2,3,7, 6,5,4,1
15.下面那个(些)操作系统属于多用户操作系统( BCD )?
A. Windows ME
B. Windows 2003
C. UNIX
D. Linux
16.下列关于排序的说法正确的是( ACD )。
A.插入排序和冒泡排序都是稳定的排序算法。
B.选择排序的平均时间复杂度为O(n2)。
C.选择排序、快速排序、希尔排序、堆排序都是不稳定的排序算法。
D.希尔排序、快速排序、堆排序的平均时间复杂度都是O(nlog2n)。
17.以下列扩展名结尾的文件,一般表示图片文件的是( AD )。
A.GIF
B.OGG
C.PSD
D.PNG
18.下面关于阿兰·麦席森·图灵(Alan Matheson Turing)说法正确的有
( ABCD )。
A.图灵是法国人。
B.图灵被称为人工智能之父。
C.人们为了纪念这位伟大的科学家将计算机界的最高奖定名为“图灵奖”。
D.图灵提出计算机的基本工作原理是存储程序和程序控制。
19.以下断电之后将不能保存数据的有( ABCD )。
A.内存
B.L1高速缓存
C.CF卡
D.ROM
20.要将高级语言程序转换为可执行文件可以使用( DB )。
A.解释程序
B.翻译程序
C.编辑程序
D.编译程序
三、问题求解(共 2 题,每题 5 分,共计 10 分)
1.某商店有m种不同颜色的小球且每种小球的数量都足够多。
要在这m种不同颜色的小球里挑选出n种小球,设共有s种不同的选法。
例如当m=2,n=3时,s
等于4,也就是说,共有4种不同的选法。
(分别为:【0,3】,【1,2】,【2,1】,【3,0】)。
现在,令m=6,n=5,试求出选法数s=___252_______。
2.现有10个外形一样的小球,其中只有一个是次品,次品的质量与正品不同,但并不知次品是比正品轻还是比正品重(亦无法用手感知)。
现有一架无砝码及游标的天平,试找出次品并确定出次品到底是比正品轻还是比正品重,请问至少需要称量__3________次,才能满足上述要求?
3 3 3 1
四、阅读程序写结果(共 4 题,每题 8 分,共计 32 分)
1. #include<stdio.h>
int x,y,u[4],v[4];
int main ()
{
for (x=0;x<=3;x++) scanf("%d",&u[x]);
v[0]=u[0]+u[2]; v[1]=v[0]+u[2];
v[2]=(u[0]-u[1]-u[2]) % u[1]-4;
v[3]=(v[0]-v[1]-v[2]) / u[0];
x= v[0]+v[1] % v[2] / v[3];
if (x<10)
y=v[0]+v[1]+v[2]+v[3];
else y=10+u[0]+v[1]+v[2]+v[3];
printf("%d:%d",x,y);
return 0;
}
输入:3 9 13 2
输出:____14:35________________
2. #include<stdio.h>
int main ()
{
int i,j,x,d,max,a[101],work[101];
scanf("%d",&max);
for (i=1;i<=max;i++){scanf("%d",&a[i]); work[i]=a[i];} d= max / 2;
while (d>=1)
{
for (i=d+1;i<=max;i++)
{
x=work[i];
j=i-d;
while ((j>0) && (x<work[j]))
{
work[j+d]=work[j];
j-=d;
}
work[j+d]=x;
}
d /= 2;
}
for (i=max;i>=1;i--)
{
if (a[i]==work[i]) printf("1");
else printf("0");
}
return 0;
}
输入:10 71 149 32 11 90 119 9 130 95 144 输出:______0010010100______________
3. #include<stdio.h>
#include<string.h>
int main ()
{
int n,p,q=1,i;
char *s = "-Fly with the same dream",a[10],c; scanf("%d",&n);
p=strchr(s,'s')-s;
s+=p+18;
s+=n-1;
c='a';
for (i=1;i<=strlen(s);i++)
if (s[i] > c)
{
a[q]=s[i];c=a[q]; ++q;
}
--q;
for (i=1;i<=q;i++) printf("%c",a[i]);
return 0;
}
输入:2
输出:____________________
4. #include<stdio.h>
int n,i;
long total=0;
int work(int a,int b)
{
int i;
long c=1,d=1,e=1;
for (i=2;i<=a;i++) c=c*i;
for (i=2;i<=b;i++) d=d*i;
for (i=2;i<= a-b;i++) e=e*i;
return(c / d / e);
}
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++) total=total work(n,i);
printf("%ld",total);
return 0;
}
输入:12
输出:____________________
五、完善程序(前 5 空,每空 2 分,后 6 空,每空 3 分,共 28 分)
1.【问题描述】
有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。
给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。
要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
(记方程f(x)=0,若存在2个数x1和x2,且x1<x2,f(x1)*f(x2)<0,则在(x1,x2)之间一定有一个根。
)
【算法分析】
如果是一般的求三次方程根的问题,那么只能直接使用求根公式,但这是非常复杂的。
由于题目要求只精确到0.01,故我们考虑一下是否可以应用数值方法进行计算。
由题目给出的方程在区间内存在根的条件可知,我们可以用一个变量从-100.000到100.000以步长0.001做循环。
若,则可知在区间内存在方程的解。
这样无论这个区间内的解是什么,在取两位小数的精度后都与取两位
小数的结果是一样的。
故我们就可以把取两位小数精度的作为问题的解。
另外还有可能方程的根在区间端点的情况,我们可以通过判断是否为0来获得。
但这种方法由于用到了题目所要求的数值精度小的特殊性,故无法扩展。
而在用数值方法求方程根的时候,我们最常用的方法就是二分法。
该方法的应用在于如果确定了方程在区间内如果存在且只存在一个根,那么我们可以用逐次缩小根可能存在范围的方法确定出根的某精度的数值。
该方法主要利用的就是题目所给的若在区间内存在一个方程的根,则这个事实,并重复执行如下的过程:
l 取当前可能存在解的区间;
l 若或,则可确定根为并退出过程;
l 若,则由题目给出的定理可知根在区间中,故对区间重复该过程;
l 若,则必然有,也就是说根在中,应该对此区间重复该过程。
最后,就可以得到精确到0.001的根。
再考虑什么样的区间内会有根。
由于题目给出了所有的根都在-100到100
之间,且根与根之间差不小于1的限制条件,故我们可知,在、、……、、这201个区间内,每个区间内至多只能存在一个根。
这样对除去区间外的其他的区间,要么,要么时这个方程在此区间内才有解。
若,显然为解;若,则可以利用上面所说的方法球出解来。
这样就可求出这个方程的所有解。
【程序代码】
#include<stdio.h>
#include<math.h>
Float x [4], a, b, c, d, u, v;
int i, t=0;
float f (float x)
{
Return ( ① );
}
Int main ()
{
Scanf ("%f%f%f%f", &a, &b, &c, &d);
For ( ② )
{
u=i;
v=u+0.99999;
if ((fabs(f(u))<0.00001) || (f(u)*f(v)<=0))
{
③ ;
If (fabs (f (u)) <0.00001) x[t] =u;
Else
{While ((u+0.001 < v) && (f ((u+v)/2)! = 0)) If ( ④ ) v= (u+v)/2;
Else u= (u+v)/2;
X[t] = (u+v) / 2;
}
}
}
For (t=1; t<=3; t++) ⑤ ;
Printf ("\n");
Return 0;
}
2.【问题描述】
对于任意给出的一个正整数n(n<=50000),求出具有n个不同因子的最小正整数m。
(例如:但n=4时m=6,因为6有4个不同整数因子:1、2、3、6,并且是最小的有4个因子的整数。
)
【算法分析】
由于具有n个不同因子的正整数一定是形如,且
n=(i1+1)*(i2+1)*…*(ik+1),要让最小,显然p1、p2、…pk要等于前k个质数。
同时i1>=i2>=…>=ik。
程序中递归过程resolve用来求出n的所有不同的因子分解式,如n=12时,其所有不同的因子分解式有:12、6*2、4*3、3*2*2四种,然后比较相应的数211、25*3、23*32、22*3*5的大小得到最小值为22*3*5=60,由于m的值可能很大,所以比较两数大小时转化为自然对数后再比较,最终结果使用了改良的高精度运算。
【程序代码】
#include<stdio.h>
#include<math.h>
#include<limits.h>
#define maxn 50000
long p[17]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
Long f[501],c[501],minc[501],m[20000];
Long h, i, j, k, l, n, t, total;
Float mins, s;
Void resolve (long dep, long m, long r)
{
Long i;
If (r==1)
{
s=0;
For (i=1; i<=dep-1; i++) s=s+ ① ; If (s < mins) {mins=s; l=dep-1;
For (i=0; i<=500; i++) minc[i] =c[i] ;} }
Else
{
For (i=m; i<=total; i++)
If ( ② )
{
C [dep] =f[i];
Resolve (dep+1, ③ );
}
}
}
Void mul (long t)
{
For (k=0; k<=h; k++) m[k] =m[k]*t;
For (k=0; k<=h; k++)
{
M [k+1] =m [k+1] +m[k]/10;
M[k] =m[k] % 10;
}
While ( ④ )
{
M [h+2] =m [h+1] / 10;
M [h+1] =m [h+1] % 10;
++h;
}
}
Int main ()
{
Scanf ("%LD", &n);
Total=0;
For (i=n; i>=2; i--)
If (n % i == 0)
{++total; f [total]=i;}
mins=LONG_MAX;
resolve(1,1,n);
for (i=1;i<=15000;i++) m[i]=0;
m[0]=1; h=0;
t=1;
for (i=1;i<=l;i++)
for (j=1;j<=minc[i]-1;j++)
if (p[i]<2000000000 / t)
t=t*p[i];
else {mul(t); ⑤ ;}
⑥ ;
for (i=h;i>=0;i--) printf("%ld",m[i]);
printf("\n"); return 0; }。