一. 单项选择题
2. 在下列各软件中,不属于 NOIP 竞赛(复赛)推荐使用的语言环境有(B)。
A. gcc/g B. Turbo Pascal
C. RHIDE D. free pascal
Wrong answer:C
错因:RHIDE->Linux c
16.将 5 个数的序列排序,不论原先的顺序如何,最少都可以通过(B)次比较,完成从小到大的排序。
A. 6 B. 7 C. 8 D. 9
Wrong answer:D
错因:我不会
17. 设 A=B=D=true,C=false,以下逻辑运算表达式值为真的有(A)。
A. (A∧B)∨(C∧D) B.((A∨B∨D)∧C)
C. A∧(B∨C∨D) D.(A∧B∧C)∨~D
Wrong answer:D
错因:没背清楚位运算符号
二. 问题求解
1.(寻找假币) 现有 80 枚硬币,其中有一枚是假币,其重量稍轻,所有真币的重量都相同,如果使用不带砝码的天平称重,最少需要称几次,就可以找出假币?你还要指出第 1 次的称重方法。请写出你的结果:
4 次,分成 27,27,26,称前两组。
Wrong answer:6次,分成两堆称
错因:不细心
2.(取石子游戏) 现有 5 堆石子,石子数依次为 3,5,7,19,50,甲乙两人轮流从任一堆中任取(每次只能取自一堆,不能不取), 取最后一颗石子的一方获胜。甲先取,问甲有没有获胜策略(即无论乙怎样取,甲只要不失误,都能获胜)?如果有,甲第一步应该在哪一堆里取多少?请写出你的结果:
有,最后一堆取32个
Wrong answer:有,取完任意一堆
错因:不理解
三. 阅读程序
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
输出:6 2 5 4 3 7 9 9 7 3 4 5 2 6
Wrong answer:/
错因:没看懂
四. 完善程序
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;
⑤ ;
}
(1). k==n
Wrong answer:k>n
错因:不仔细
(2). count%5==0
Wrong answer:count>=5
错因:不仔细(好气)
- 由键盘输入一个奇数 P (P<100,000,000),其个位数字不是5,求一个整数 S,使 P×S = 1111…1 ( 在给定的条件下,解 S 必存在)。要求在屏幕上依次输出以下结果:
(1)S 的全部数字。除最后一行外,每行输出 50 位数字。(2) 乘积的数字位数。
例1:输入p=13,由于13*8547=111111,则应输出(1)8547,(2)6
例2:输入p=147,则输出结果应为(1)755857898715041572184429327286470143613
(2)42,即等式的右端有42个1。
程序:
#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;
c= ⑧ ;
a= ⑨ ;
n++;
} while (c>0);
cout<<endl<<"n="<< ⑩ <<endl;
}
(9). c*10+1
Wrong answer:a*10+1
错因:想错了