在以下各项中,( )不是 CPU 的组成部分
A. 控制器 B. 运算器 C. 寄存器 D. 主板
正确答案: D
CPU由运算器、运算器、寄存器组成
在关系数据库中,存放在数据库中的数据的逻辑结构以( )为主。
A. 二叉树 B. 多叉树 C. 哈希表 D. 二维表
正确答案: D
数据结构表示为一个二维表,一个关系就是一个二维表(但不是任意一个二维表都能表示一个关系),二维表名就是关系名。表中的第一行通常称为属性名,表中的每一个元组和属性都是不可再分的,且元组的次序是无关紧要的。
在下列各项中,只有( )不是计算机存储容量的常用单位。
A. Byte B. KB C. UB D. TB
正确答案: C
UB是什么东东
ASCII 码的含义是( )。
A. 二→十进制转换码 B. 美国信息交换标准代码 C. 数字的二进制编码 D. 计算机可处理字符的唯一编码
正确答案: B
ASCII (American Standard Code for Information Interchange):美国信息交换标准代码是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准 ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符
一个完整的计算机系统应包括( )。
A. 系统硬件和系统软件 B. 硬件系统和软件系统 C. 主机和外部设备 D. 主机、键盘、显示器和辅助存储器
正确答案: B
硬件系统指主机,软件系统包含系统软件和应用软件
IT 的含义是( )。
A. 通信技术 B. 信息技术 C. 网络技术 D. 信息学
正确答案: B
IT:Information Technology
LAN 的含义是( )。
A. 因特网 B. 局域网 C. 广域网 D. 城域网
正确答案: B
LAN:局域网 MAN:城域网 WAN:广域网
冗余数据是指可以由其它数据导出的数据。例如,数据库中已存放了学生的数学、语文和英语的三科成绩,如果还存放三科成绩的总分,则总分就可以看作冗余数据。冗余数据往往会造成数据的不一致。例如,上面 44 个数据如果都是输入的,由于操作错误使总分不等于三科成绩之和,就会产生矛盾。下面关于冗余数据的说法中,正确的是( )。
A. 应该在数据库中消除一切冗余数据
B. 用高级语言编写的数据处理系统,通常比用关系数据库编写的系统更容易消除冗余数据
C. 为了提高查询效率,在数据库中可以保留一些冗余数据,但更新时要做相容性检验
D. 做相容性检验会降低效率,可以不理睬数据库中的冗余数据
正确答案: C
数据冗余发生在数据库系统中,指的是一个字段在多个表里重复出现。 数据冗余会导致数据异常和损坏,一般来说设计上应该被避免。 数据库规范化防止了冗余而且不浪费存储容量。 适当的使用外键可以使得数据冗余和异常降到最低。但是,如果考虑效率和便利,有时候也会设计冗余数据,而不考虑数据被破坏的风险。
在下列各软件,不属于 NOIP 竞赛(复赛)推荐使用的语言环境有( )。
**编者注:由于试题为 2007 年的试题,请根据 2007 年的实际情况作答。 **
A. gcc B. g++ C. Turbo C D. Free Pascal
正确答案: C
Turbo C 已经被淘汰
以下断电后仍能保存数据的有( )。
A. 硬盘 B. 高速缓存 C. 显存 D. RAM
正确答案: A
高速缓存:cache RAM:随机存储器
近 20 年来,许多计算机专家都大力推崇递归算法,认为它是解决较复杂问题的强有力的工具。在下列关于递归算法的说法中,正确的是( )。
A. 在 1977 年前后形成标准的计算机高级语言 FORTRAN77 禁止在程序使用递归,原因之一是该方法可能会占用更多的内存空间
B. 和非递归算法相比,解决同一个问题,递归算法一般运行得更快一些
C. 对于较复杂的问题,用递归方式编程一般比非递归方式更难一些
D. 对于已经定义好的标准数学函数 sin(x),应用程序中的语句“y=sin(sin(x));”就是一种递归调用
正确答案: A
C 分治法,比如快速排序
D 是否递归是函数本身决定的,不是调用决定的,y=sin(sin(sin(x)));不过是算完了a=sin(x),再算b=sin(a),再算y=sin(b)
一个无法靠自身的控制终止的循环成为“死循环”,例如,在 C++ 语言程序中,语句 while(1) printf("*");
就是一个死循环,运行时它将无休止地打印 *
号。下面关于死循环的说法中,只有( )是正确的。
A. 不存在一种算法,对任何一个程序及相应的输入数据,都可以判断是否会出现死循环,因而,任何编译系统都不做死循环检查
B. 有些编译系统可以检测出死循环
C. 死循环属于语法错误,既然编译系统能检查各种语法错误,当然也应该能检查出死循环
D. 死循环与多进程中出现的“死锁”差不多,而死锁是可以检测的,因而,死循环也可以检测的
23|2^5=23
在 C++ 语言中,判断 a 等于 0 或 b 等于 0 或 c 等于 0 的正确的条件表达式是( )。
A. !((a!=0)||(b!=0)||(c!=0))
B. !((a!=0)&&(b!=0)&&(c!=0))
C. !(a==0&&b==0)||(c!=0)
D. (a=0)&&(b=0)&&(c=0)
正确答案: B
B选项,如果有 a b c 中有一个数不为一,那么内层判断为 false , false 取反即为 true
地面上有标号为 A、B、C 的三根柱,在 A 柱上放有 1010 个直径相同中间有孔的圆盘,从上到下依次编号为 1,2,3…,将 A 柱上的部分盘子经过 B 柱移入 C 柱,也可以在 B 柱上暂存。如果 B 柱上的操作记录为“进、进、出、进、进、出、出、进、进、出、进、出、出”。那么,在 C 柱上,从下到上的编号为( )。
A. 2 4 3 6 5 7 B. 2 4 1 2 5 7 C. 2 4 3 1 7 6 D. 2 4 3 6 7 5
正确答案: D
有点像汉诺塔,说白了就是让你手工模拟,大意如下:
![]()
与十进制数 17701770 对应的八进制数是( )。
A. 3350 B. 3351 C. 3352 D. 3540
正确答案: C
十进制转其他进制:短除法 其他进制转十进制:乘位权
![]()
设 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
正确答案: D
D∨C=false A∧false=false false∧B=false (A∧(D∨C))∧B=flase
(
2070
)
16
+
(
34
)
8
的结果是()。
A
.
(
8332
)
10
B
.
(
208
)
16
C
.
(
100000000110
)
2
D
.
(
20212
)
8
正确答案:
A
(
2070
)
16
+
(
34
)
8
=
(
8304
)
10
+
(
28
)
10
=
(
8332
)
10
(2070)_{16}+(34)_8的结果是( )。 \\ A. (8332)_{10} \\B. (208)_{16} \\C. (100000000110)_2 \\D. (20212)_8 \\ 正确答案: A\\ (2070)_{16}+(34)_8=(8304)_{10}+(28)_{10}=(8332)_{10}
(2070)16+(34)8的结果是()。A.(8332)10B.(208)16C.(100000000110)2D.(20212)8正确答案:A(2070)16+(34)8=(8304)10+(28)10=(8332)10
已知 77 个节点的二叉树的先根遍历是 1 2 4 5 6 3 71 2 4 5 6 3 7(数字为节点的编号,以下同),中根遍历是 4 2 6 5 1 7 34 2 6 5 1 7 3,则该二叉树的后根遍历是( )。
A. 4 6 5 2 7 3 14 6 5 2 7 3 1 B. 4 6 5 2 1 3 74 6 5 2 1 3 7
C. 4 2 3 1 5 4 74 2 3 1 5 4 7 D. 4 6 5 3 1 7 24 6 5 3 1 7 2
正确答案: A
如下图:
![]()
(子集划分)将 n 个数 ( 1 , 2 , … , n ) ( 1 , 2 , … , n ) 划分成 r 个子集。 每个数都恰好属于一个子集,任何两个不同的子集没有共同的数,也没有空集。 将不同划分方法的总数记为 S ( n , r ) 。例如, ( 4 , 2 ) = 7 , 这 7 种不同的划分方法依次为 { ( 1 ) , ( 234 ) } , { ( 2 ) , ( 134 ) } , { ( 3 ) , ( 124 ) } , { ( 4 ) , ( 123 ) } { ( 1 ) , ( 234 ) } , { ( 2 ) , ( 134 ) } , { ( 3 ) , ( 124 ) } , { ( 4 ) , ( 123 ) } , { ( 12 ) , ( 34 ) } , { ( 13 ) , ( 24 ) } , { ( 14 ) , ( 23 ) } { ( 12 ) , ( 34 ) } , { ( 13 ) , ( 24 ) } , { ( 14 ) , ( 23 ) } 。 当 n = 6 , r = 3 时, s ( 6 , 3 ) = ? ( 提示:先固定一个数,对于其余的 55 个数考虑 S ( 5 , 3 ) 与 S ( 5 , 2 ) , 再分这两种情况对原固定的数进行分析。 ) (子集划分)将 n 个数 (1,2,…,n)(1,2,…,n) 划分成r个子集。\\每个数都恰好属于一个子集,任何两个不同的子集没有共同的数,也没有空集。\\将不同划分方法的总数记为S(n,r)。例如,(4,2)=7,\\这7种不同的划分方法依次为 \{(1),(234)\},\{(2),(134)\},\{(3),\\(124)\},\{(4),(123)\}\{(1),(234)\},\{(2),(134)\},\\\{(3),(124)\},\{(4),(123)\},\{(12),(34)\},\{(13),\\(24)\},\{(14),(23)\}\{(12),(34)\},\{(13),(24)\},\\\{(14),(23)\}。\\当 n=6,r=3 时,s(6,3)=?\\ (提示:先固定一个数,对于其余的 55 个数考虑 S(5,3) 与S(5,2),\\再分这两种情况对原固定的数进行分析。) (子集划分)将n个数(1,2,…,n)(1,2,…,n)划分成r个子集。每个数都恰好属于一个子集,任何两个不同的子集没有共同的数,也没有空集。将不同划分方法的总数记为S(n,r)。例如,(4,2)=7,这7种不同的划分方法依次为{(1),(234)},{(2),(134)},{(3),(124)},{(4),(123)}{(1),(234)},{(2),(134)},{(3),(124)},{(4),(123)},{(12),(34)},{(13),(24)},{(14),(23)}{(12),(34)},{(13),(24)},{(14),(23)}。当n=6,r=3时,s(6,3)=?(提示:先固定一个数,对于其余的55个数考虑S(5,3)与S(5,2),再分这两种情况对原固定的数进行分析。)
s ( 4 , 2 ) = C 4 1 + C 4 2 / 2 = 4 + 6 / 2 = 4 + 3 = 7. 为什么除以 2 呢? 因为从 4 个数中选 2 个数,而其余 2 个数自然也就定了。因此算了 2 次,所以要除以 2 设想 : s ( n , k ) = k ∗ s ( n − 1 , k ) + s ( n − 1 , k − 1 ) 例如: s ( 4 , 2 ) = 2 × s ( 3 , 2 ) + s ( 3 , 1 ) = 2 × 3 + 1 = 7 , 验证。 S ( 6 , 3 ) = 3 × s ( 5 , 3 ) + s ( 5 , 2 ) S ( 5 , 3 ) = 3 × s ( 4 , 3 ) + s ( 4 , 2 ) 根据右边计算结果。所得结果是 : S ( 4 , 3 ) = 3 × ( 3 , 3 ) + s ( 3 , 2 ) = 3 × 1 + 3 = 6 所以 s ( 5 , 3 ) = 3 × 6 + 7 = 25 S ( 5 , 2 ) = 2 × s ( 4 , 2 ) + s ( 4 , 1 ) = 2 × 7 + 1 = 15 S ( 6 , 3 ) = 3 × 25 + 15 = 75 + 15 = 90 答案: 90 s(4,2)=C_4^1+C_4^2/2=4+6/2=4+3=7.为什么除以2呢?\\因为从4个数中选2个数,而其余2个数自然也就定了。因此算了2次,所以要除以2\\ 设想: s(n,k)=k*s(n-1,k)+s(n-1,k-1) \\ 例如:s(4,2)=2\times s(3,2)+s(3,1)=2\times 3+1=7, 验证。\\ S(6,3)=3\times s(5,3)+s(5,2) S(5,3)=3\times s(4,3)+s(4,2)\\ 根据右边计算结果。所得结果是:\\ S(4,3)=3\times (3,3)+s(3,2)=3\times 1+3=6 所以s(5,3)=3\times 6+7=25\\ S(5,2)=2\times s(4,2)+s(4,1)=2\times 7+1=15\\ S(6,3)=3\times 25+15=75+15=90\\ 答案:90 s(4,2)=C41+C42/2=4+6/2=4+3=7.为什么除以2呢?因为从4个数中选2个数,而其余2个数自然也就定了。因此算了2次,所以要除以2设想:s(n,k)=k∗s(n−1,k)+s(n−1,k−1)例如:s(4,2)=2×s(3,2)+s(3,1)=2×3+1=7,验证。S(6,3)=3×s(5,3)+s(5,2)S(5,3)=3×s(4,3)+s(4,2)根据右边计算结果。所得结果是:S(4,3)=3×(3,3)+s(3,2)=3×1+3=6所以s(5,3)=3×6+7=25S(5,2)=2×s(4,2)+s(4,1)=2×7+1=15S(6,3)=3×25+15=75+15=90答案:90
(最短路线)某城市的街道是一个很规整的矩形网络(见下图),有 77 条南北向的纵街,55 条东西向的横街。现要从西南角的 A 走到东北角的 B ,最短的走法共有多少种?___________
正确答案: 210
最少走10条路径,其中选出4条竖线 或 6条横线,即 C 10 4 C_{10}^4 C104 或 C 10 6 C_{10}^6 C106 ,其结果一致
看程序写结果:
#include<stdio.h>
int main()
{
int i, p[5], a, b, c, x, y = 20;
for ( i = 0; i <= 4; i++ )
scanf( "%d", &p[i] );
a = (p[0] + p[1]) + (p[2] + p[3] + p[4]) / 7;
b = p[0] + p[1] / ( (p[2] + p[3]) / p[4]);
c = p[0] * p[1] / p[2];
x = a + b - p[(p[3] + 3) % 4];
if ( x > 10 )
y += (b * 100 - a) / (p[p[4] % 3] * 5);
else
y += 20 + (b * 100 - c) / (p[p[4] % 3] * 5);
printf( "%d,%d\n", x, y );
return(0);
}
//注:本例中,给定的输入数据可以避免分母为 0 或数组元素下标越界。
输入:6 6 5 5 3
正确答案: 15,46
a
=
(
6
+
6
)
+
(
5
+
5
+
3
)
÷
7
=
12
+
13
÷
7
=
12
+
1
=
13
b
=
6
+
6
÷
(
(
5
+
5
)
÷
3
)
=
12
÷
3
=
8
c
=
6
×
6
÷
5
=
36
÷
5
=
7
x
=
13
+
8
−
p
[
(
5
+
3
)
%
4
]
=
13
+
8
−
p
[
0
]
=
13
+
8
−
6
=
15
y
=
20
+
(
8
×
100
−
13
)
÷
(
p
[
0
]
×
5
)
=
20
+
787
÷
(
6
×
5
)
=
20
+
787
÷
30
=
20
+
26
=
46
a=(6+6)+(5+5+3)\div 7=12+13\div 7=12+1=13\\ b=6+6\div ((5+5)\div 3)=12\div 3 = 8\\ c = 6 \times 6 \div 5 = 36 \div 5 = 7\\ x=13 + 8 - p[(5 + 3)\%4]=13+8-p[0]=13+8-6=15\\ y=20+(8\times 100-13)\div (p[0]\times 5)=20+787\div (6\times 5)=20+787\div 30=20+26=46
a=(6+6)+(5+5+3)÷7=12+13÷7=12+1=13b=6+6÷((5+5)÷3)=12÷3=8c=6×6÷5=36÷5=7x=13+8−p[(5+3)%4]=13+8−p[0]=13+8−6=15y=20+(8×100−13)÷(p[0]×5)=20+787÷(6×5)=20+787÷30=20+26=46
看程序写结果:
#include<stdio.h>
void fun( int *a, int *b )
{
int *k;
k = a; a = b; b = k;
}
int main()
{
int a = 3, b = 6, *x = &a, *y = &b;
fun( x, y );
printf( "%d,%d ", a, b );
}
输出:_______________________________
正确答案: 3,6
fun()函数几乎无意义,k指针变量指了一圈指了回来,而且这些操作进对传进来的变量(形参)进行改变
看程序写结果:
#include "math.h"
#include "stdio.h"
int main()
{
int a1[51] = { 0 };
int i, j, t, t2, n = 50;
for ( i = 2; i <= sqrt( n ); i++ )
if ( a1[i] == 0 )
{
t2 = n / i;
for ( j = 2; j <= t2; j++ )
a1[i * j] = 1;
}
t = 0;
for ( i = 2; i <= n; i++ )
if ( a1[i] == 0 )
{
printf( "%4d", i ); t++;
if ( t % 10 == 0 )
printf( "\n" );
}
printf( "\n" );
}
每行四分
正确答案: 2 3 5 7 11 13 17 19 23 29
每行四分
正确答案: 31 37 41 43 47
模拟可得标记为1的下标有
4 6 8 9 10 12 14 15 16 18 20 21 22 24 25 26 27 28 30 32 33 34 35 36 38 39 40 42 44 45 46 48 49 50空一为:2 3 5 7 11 13 17 19 23 29 (注意每输出10个数字换行)
空二为:31 37 41 43 47
看程序写结果:
#include "ctype.h"
#include "stdio.h"
void expand( char s1[], char s2[] )
{
int i, j, a, b, c;
j = 0;
for ( i = 0; (c = s1[i]) != '\0'; i++ )
if ( c == '-' )
{
a = s1[i - 1]; b = s1[i + 1];
if ( isalpha( a ) && isalpha( b ) || isdigit( a ) && isdigit( b ) )
/*函数 isalpha(a) 用于判断字符 a 是否为字母,isdigit(b) 用于判断字符 b 是否为数字,如果是,返回 1,否则返回 0 */
{
j--;
do
s2[j++] = a++;
while ( tolower( a ) < tolower( s1[i + 1] ) );
}
/*函数 tolower(a) 的功能是当字符 a 是大写字母,改为小写,其余情况不变*/
else s2[j++] = c;
}else s2[j++] = c;
s2[j] = '\0';
}
int main()
{
char s1[100], s2[300];
printf( "input s1:" );
gets( s1 );
expand( s1, s2 );
printf( "%s\n", s2 );
}
输入:wer2345d-h454-82qqq
正确答案: input s1:wer2345defgh45456782qqq
for ( i = 0; (c = s1[i]) != ‘\0’; i++ ) 遍历字符串 s1
如果没有 “-” 照抄
如果 “-” 的左右两边都是字母或数字,即 “-” 不输出,输出 a[i]+1 到 a[i+1]-1,其他照抄
第 27 题
完善程序:
(求字符的逆序)下面的程序的功能是输入若干行字符串,每输入一行,就按逆序输出该行,最后键入 −1−1 终止程序。请将程序补充完整。
#include <iostream.h>
#include <string.h>
int maxline = 200, kz;
int reverse( char s[] )
{
int i, j, t;
for ( i = 0, j = strlen( s ) - 1; i < j; 【①】 , 【②】 )
{
t = s[i]; s[i] = s[j]; s[j] = t;
}
return(0);
}
int main()
{
char line[100];
cout << "continue? -1 for end." <<endl;
cin>>kz;
while(【③】)
{
cin >> line;
【④】;
cout << line << endl;
cout << "continue ? -1 for end." << endl;
cin >> kz;
}
}
1.______________________________________
正确答案: i++ / i=i+1 / i+=1 / ++i
2.______________________________________
正确答案: j-- / j=j-1 / j-=1 / --j
3.______________________________________
正确答案: kz!=-1
4.______________________________________
正确答案: reverse(line)
注意,NOIP的题都不像CSP有选项
空一、空二:看函数名 reverse 告诉我们是让字符串反转,
for ( i = 0, j = strlen( s ) - 1; i < j; 【①】 , 【②】 )
i指着数组的头,j指着数组的尾,i始终小于j,可以感觉到是双游标发,即i++
j--
空三:
cout << "continue? -1 for end." <<endl; cin>>kz;
可以看出kz
是输入是否继续的,根据题意,while循环中应填kz!=-1
空四:程序到了这里,还没见函数的调用,所以应调用函数了,`int reverse( char s[] )` 可以看出应传 char 类型的数组,满足的只有 line 变量,即答案是 `reverse(line)`
完善程序:
(棋盘覆盖问题)在一个 2�×2�2k×2k 个方格组成的棋盘中恰有一个方格与其它方格不同(图中标记为 −1−1 的方格),称之为特殊方格。现 L 型(占 33 个小方格)纸片覆盖棋盘上除特殊方格的所有部分,各纸片不得重叠,于是,用到的纸片数恰好是 (4�−1)33(4k−1)。在下表给出的一个覆盖方案中,�=2k=2,相同的 33 各数字构成一个纸片。下面给出的程序使用分治法设计的,将棋盘一分为四,依次处理左上角、右上角、左下角、右下角,递归进行。请将程序补充完整。
2 2 3 3
2 -1 1 3
4 1 1 5
4 4 5 5
#include <iostream.h>
#include <iomanip.h>
int board[65][65], tile; /* tile为纸片编号 */
void chessboard( int tr, int tc, int dr, int dc, int size )
/* dr,dc依次为特殊方格的行、列号 */
{
int t, s;
if ( size == 1 )
① ;
t = tile++;
s = size / 2;
if ( ② )
chessboard( tr, tc, dr, dc, s );
else{
board[tr + s -1][tc + s -1] = t;
[③];
}
if ( dr < tr + s && dc >= tc + s )
chessboard( tr, tc + s, dr, dc, s );
else{
board[tr + s -1][tc + s] = t;
④;
}
if ( dr >= tr + s && dc < tc + s )
chessboard( tr + s, tc, dr, dc, s );
else{
board[tr + s][tc + s -1] = t;
[⑤];
}
if ( dr >= tr + s && dc >= tc + s )
chessboard( tr + s, tc + s, dr, dc, s );
else{ board[tr + s][tc + s] = t;
[⑥]; }
}
void prtl( int b[][65], int n )
{
int i, j;
for ( i =1; i <= n; i++ )
{
for ( j =1; j <= n; j++ )
cout << setw( 3 ) << b[i][j];
cout << endl;
}
}
void main()
{
int size, dr, dc;
cout << "input size(4/8/16/64):" << endl;
cin >> size;
cout << "input the position of special block(x,y):" << endl;
cin >> dr >> dc;
board[dr][dc] = -1;
tile++;
chessboard( 1, 1, dr, dc, size );
prtl( board, size );
}
1._____________________________________
正确答案: return
2._____________________________________
正确答案: (dr<tr+s)&&(dc<tc+s) / dr<tr+s&&dc<tc+s
3._____________________________________
正确答案: chessboard(tr,tc,tr+s-1,tc+s-1,s)
4._____________________________________
正确答案: chessboard(tr,tc+s,tr+s-1,tc+s,s)
5._____________________________________
正确答案: chessboard(tr+s,tc,tr+s,tc+s-1,s)
6._____________________________________
正确答案: chessboard(tr+s,tc+s,tr+s,tc+s,s)
1.突破口—告诉你分治的方法和分治策略,递归围绕着分治去做
2.结合chessboard 函数定义理解递归函数的参数:tr,tc代表方块的左上角,dr,dc
正确答案: (dr<tr+s)&&(dc<tc+s) / dr<tr+s&&dc<tc+s
3._____________________________________
正确答案: chessboard(tr,tc,tr+s-1,tc+s-1,s)
4._____________________________________
正确答案: chessboard(tr,tc+s,tr+s-1,tc+s,s)
5._____________________________________
正确答案: chessboard(tr+s,tc,tr+s,tc+s-1,s)
6._____________________________________
正确答案: chessboard(tr+s,tc+s,tr+s,tc+s,s)
1.突破口—告诉你分治的方法和分治策略,递归围绕着分治去做
2.结合chessboard 函数定义理解递归函数的参数:tr,tc代表方块的左上角,dr,dc