190 likes | 245 Views
程序填空. 程序填空题的特点. 是初赛试题中最难的题目。这些程序都具有高效 , 规范的特点 , 如果你读懂了 , 会有一种“恍然大悟”的感觉。 题目中会明确交代程序的目的(功能),还有的问题会明确告诉所使用的算法。但也有些问题需要选手揣摩题目使用的算法,有时题目会独创一些算法,即在教科书中找不到的算法 . 将一些关键的语句或变量、函数等去掉,让选手去填写。
E N D
程序填空题的特点 • 是初赛试题中最难的题目。这些程序都具有高效,规范的特点,如果你读懂了,会有一种“恍然大悟”的感觉。 • 题目中会明确交代程序的目的(功能),还有的问题会明确告诉所使用的算法。但也有些问题需要选手揣摩题目使用的算法,有时题目会独创一些算法,即在教科书中找不到的算法. • 将一些关键的语句或变量、函数等去掉,让选手去填写。 • 有的空不止一种填法,如i:=i+1,可以用inc(i)表示,i:=i-1可以用dec(i)表示,while p=true可以用 while p表示,a>b可以用not a<=b或b<a表示,填写时尽量简洁明了。
解题的一般方法 • 理解题意: 主要是根据问题的描述,确定问题的已知条件,并了解算法(程序)要达到的目的。通俗讲,就是要知道问题的输入和输出。 • 确定算法: 每个题目在前面都有描述,通过对描述的分析,要确定题目应该属于哪一类数据结构以及相应的算法。有些题目可能不属于任何数据结构,则它可能与某类算法有关;但也有一些算法纯粹是数学方法或数学问题。 在描述中同时要理解算法过程。在分析算法时,可以以某个具体实例来试验(类似于程序阅读中的“模拟法”)。 • 理解程序: 分析程序结构,如果有很多子函数,首先弄清楚各函数之间的关系和各函数的作用;如果程序较长,则应该根据算法过程,把每个程序段与算法的每个过程对应起来,确定相应的程序段功能。 在程序中,已经定义了某些变量,则在理解程序时,首先必须理解这些变量的含义 • 根据Pascal语言的语法填空,不能将平时写作文时或做数学题时的习惯写法带到Pascal中来。
小技巧 • 主程序或子程序的开始部分,往往涉及到变量的初始化,如整型变量初始为0或1等,一个数组所有元素全部初始为0或1等…… • 主程序或子程序的说明部分,往往涉及到变量的定义。 • 如果调用了子程序,注意传递了哪个(些)变量,是传值还是传地址。
例题1 题目描述: 方程ax^2+bx+c=0,要求给出它的实数解. 输 入: 三个实数:a,b,c,是方程的三个系数(a≠0). 输 出: 如果无实数解,则输出"No solution"; 如果有两个相等的实数解,则输出其中一个,四舍五入到小数点后面3位; 如果有两个不等的实数解,则解与解之间用逗号隔开,同样要四舍五入到小数点后3位 输入样例: l 2 1 输出样例: -1.000
Program c200301; var a,b,c,m:real; begin read (a,b,c); m:=b*b -4*a*c; if ( ① )then begin write ( ②:0:3); write( ` , ` ); write ((-1*b-sqrt(m))/(2*a):0: ③ ); end else if ( ④ )then write( ⑤ ) else begin write (`No solution`); end end.
参考答案 (1) m>0 (2)(-b+sqrt(m)/(2*a)) (3)3 (4)m=0 (5)-b/(2*a)
例题2 三角形内切圆的面积 题目描述: 给出三角形三边的边长,求此三角形内切圆(如上图所示,三角形的内切圆是和三角形三边都相切的圆)的面积。 输入: 三个正实数a、b、c(满足a+b>c,b+c>a,c+a>b), 表示三角形三边的边长。 输出: 三角形内切圆的面积,结果四舍五入到小数点后面2位。 输入样例: 3 4 5 输出样例: 3.14
程序: program program1; var a, b, c, r, s, t: real; begin read(a, b, c); s := ( ① ) / 2; t := ② (s * (s - a) * (s - b) * (s - c)); r := t / s; writeln(3.1415927 * r * ③ : 0 : ④ ); end.
参考答案 • a+b+c • Sqrt • r
例题3 判断质数 题目描述: 给出一个正整数,判断这个数是否是质数。 输入: 一个正整数n(1 ≤ n ≤ 10000)。 输出: 如果n是质数,输出”YES”;否则,输出”NO”。 输入样例: 10 输出样例: NO
程序: var ① : integer; begin read(n); if n = 2 then writeln( ② ) else if ( ③ ) or (n mod 2 = 0) then writeln('NO') else begin i := 3; while i * i <= n do begin if ④ then begin writeln('NO'); exit; end; i := i + 2; {!为什么它不用i:=i+1?i是奇数还是偶数?} end; writeln('YES'); end; end. 附加问题:用的是什么算法?
(1) i,n (2)’YES’ (3)n=1 (4)n mod i=0
例题4 输入n个0到100之间的整数,由小到大排序输 出,每行输出8个。
程序清单: program chu7_5; var i,j,k,n,x:integer; b:array[0..100]of integer; begin readln(n); for i:=0 to 100 do b[i]:=0; for i:=1 to n do begin readln(x); b[x]:=① {需要突破的重点} end; ② for i:=0 to 100 do while③do begin write(④); k:=k+1; b[i]:=b[i]-1; if⑤then writeln end; readln end.
参考答案 • b[x]+1 • K=0 • b[i]>0 或 b[i]<>0 • I • K mod 8=0 每输出8个后换一行 分析:数组b[x]指的是x输入的次数,如输入5个整数,分别是0,0,0,99,2,则b[0]=3,b[2]=1,b[99]=1,而b[1]等其余的98个数组元素全部为0 程序中的第三个空所涉及的while循环,输出重复的整数,如上述实例,b[0]=3,则将输出三个0
例题5,NOIP2006 由键盘输入一个奇数 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。 程序:
program ex402; var p,a,b,c,t,n:longint; begin while (true) do begin writeln ('Input p, the last digit is 1 or 3 or 7 or 9:'); readln(p); if (p mod 2<>0)and(p mod 5<>0) then ① ; {如果输入的数符合要求,结束循环 } end; a:=0; n:=0; while (a<p) do begin a:=a*10+1; inc(n); end; t:=0; repeat b:=a div p; write(b:1); inc(t); if ( ② ) then writeln; c:= ③ ; a:= ④ ; inc(n); until c<=0; dec(n); writeln; writeln('n=', ⑤ ); end.
参考答案 ① break ② t mod 50=0 ③ a-p*b(或a-b*p) ④c*10+1 (或10*c+1) ⑤n