NOIP 2007 普及组初赛试题题目答案及解析

在以下各项中,( )不是 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 中有一个数不为一,那么内层判断为 falsefalse 取反即为 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

有点像汉诺塔,说白了就是让你手工模拟,大意如下:

image-20230811154839577

与十进制数 17701770 对应的八进制数是( )。

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

正确答案: C

十进制转其他进制:短除法 其他进制转十进制:乘位权

image-20230811155807663

A=B=TrueC=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

如下图:

image-20230811161447957

(子集划分)将 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)=77种不同的划分方法依次为{(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)=ks(n1,k)+s(n1,k1)例如: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 ,最短的走法共有多少种?___________
img

正确答案: 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+8p[(5+3)%4]=13+8p[0]=13+86=15y=20+(8×10013)÷(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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: NOIP(全国信息学奥林匹克联赛,National Olympiad in Informatics in Provinces)是中国的一项计算机编程竞赛,分为普及和提高2007年的NOIP普及初赛试题是一道编程题。 此题要求编写一个程序,统计一个给定整数的位数,并输出结果。例如,给定数字156,程序应输出3,因为156有3位数字。 解决这个问题的一种方法是,将给定数字转换为字符串,并计算字符串的长度。具体做法如下: 1. 首先,从输入中接收一个整数。 2. 将整数转换为字符串,可以使用内置的str()函数,它可以将整数转换为字符串类型。 3. 使用内置的len()函数获取字符串的长度。 4. 输出字符串的长度,即该数字的位数。 以下是一个简单的示例代码: ``` num = int(input("请输入一个整数:")) # 接收一个整数 num_str = str(num) # 转换为字符串 count = len(num_str) # 获取字符串长度 print("该数字的位数为:" + str(count)) # 输出结果 ``` 这段代码首先接收一个整数,然后将它转换为字符串。接着,通过使用len()函数获取字符串的长度,并将结果输出。 总结来说,2007NOIP普及初赛试题要求编写一个程序,统计给定整数的位数。我们可以将整数转换为字符串,然后使用len()函数获取字符串的长度,即得到该数字的位数。以上是一个简单示例代码,实现了该功能。 ### 回答2: NOI(全国青少年信息学奥林匹克竞赛)是中国举办的一项重要的计算机竞赛,包括高级普及两个级别。而NOIP 2007普及初赛试题是该比赛中一道典型的问题。以下是对这个试题的300字中文回答: NOIP 2007普及初赛试题要求我们计算一个数的阶乘结果中末尾0的个数。阶乘,即一个数的所有正整数的乘积。题目给出了一个整数N,要求计算N的阶乘结果末尾0的个数。 我们可以观察到,N的阶乘结果末尾零的个数,取决于N中因子5的个数。因为每枚一次因子5,就会多一个末尾零。通过这个规律,我们可以将问题转化为计算N中因子5的个数。 首先,我们从1到N遍历每个数,看其是否能被5整除,如果可以,则计数器加一,代表多了一个因子5。接着继续判断当前数是否能被5整除,重复上述操作,直到当前数不能被5整除为止。最终,计数器的值就代表了N的阶乘结果中末尾0的个数。 通过这种方法,我们可以在O(logN)的时间复杂度内求得结果。值得注意的是,如果N特别大,超出了整型数所能表示的范围,需要使用更大的数据类型来存储结果。 总而言之,NOIP 2007普及初赛试题通过计算一个数的阶乘结果中末尾0的个数,考察了我们对数学规律的理解和代码的实现能力。我们可以通过观察规律,将问题转化为计算因子5的个数,并在较低的时间复杂度内求解。这是一个典型的数学问题,需要我们在解决过程中运用数学思维和编程技巧。 ### 回答3: noip 2007 普及初赛试题是全国信息学奥林匹克竞赛的一份初级试题,旨在考查学生在计算机编程和算法方面的基本能力。 该试题包含多个题目,其中一个例题是求最大公约数。该题要求给定两个正整数A和B,计算它们的最大公约数。最大公约数是指能够同时整除A和B的最大正整数。 解答这个问题的一种常见算法是欧几里德算法。该算法的基本思想是通过连续进行取模运算,将较大的数变成较小的数,直到整除为止。具体步骤如下: 1. 如果A能够整除B,则B就是最大公约数; 2. 否则,将B取模A,得到的余数记为R; 3. 将A赋值为原来的B,将B赋值为原来的R; 4. 重复步骤1和步骤2,直到B能够整除A为止。 通过使用欧几里德算法,可以快速地求出A和B的最大公约数。 除了求最大公约数之外,试题还包含其他题目,如字符串处理、排序算法、简单的图论等。这些题目旨在考察学生的编程能力、算法设计和实现能力。 参加noip 2007 普及初赛试题的考生需要具备一定的编程基础知识和算法理解能力。通过解答这些问题,学生不仅可以提高自己的编程技能,还可以锻炼自己的逻辑思维和问题解决能力。 参加noip 2007 普及初赛试题的考生需要认真学习相关的编程知识和算法理论,多进行编程练习和模拟考试,提升自己的编程水平和应试能力,为将来参加更高级别的信息学竞赛做好准备。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值