这是NOIP2009初赛普及组(Pascal版本)第四大题(阅读程序写结果)第4小题,题目中存在一处数据输入格式的错误:该题提供的输入为“NOIP 3”,本意是分别读入到一个字符串和整型变量中,但是由于本题的输入在同一行(read(a); read(n); ),数据中缺少一个换行,按照程序的写法,Pascal语言会将这一行输入都作为字符串读入,而无法读到3,因此程序的实际运行无法得到答案给出的结果。
经过讨论,该题在阅卷时接受以下三种情况的答案(仅限Pascal语言,不涉及C/C++语言的试卷),即以下3种情形均可得分:
1NPOI(注:按照题目本意理解并正确完成)。
2NOIP 3 (注:此种情况是输入“NOIP 3”后,程序等待继续输入时,输入Ctrl+Z结束输入,也包括文件流定向到标准输入的情形)。
3结果处给出适当文字说明,例如“等待输入”;“程序无法结束”;“根据不同的n值,输出结果不同”等,但结果处简单空白且不加任何说明将不给分。
程序其实也不难,仔细在草稿纸上模拟一小就好了。(当年我程序部分几乎全对,只是做最后一道完善程序时只剩13分钟,于是放弃了,白白扣了13分,::>_<::,回家仔细一看,不到3分钟就全做出来了,真是亏大了)
a='NOIP' n=3
a='NOPI' n=2
a='NPIO' n=1
a='NPOI' n=0
所以,最终输出NPOI
Pascal是通用程序设计语言,可以干各种事。Pascal在对面向过程的结构化编程风格支持得非常好。
目前主要用于教学,直接的实用很少。
不过大名鼎鼎的专业科技排版软件TeX就是由Knuth教授用Pascal写的,这个大概是Pascal写出来的最出名,应用也最广泛的软件。
另外,Borland公司的Delphi就是以Pascal为基础的一个面向对象的语言及开发工具。这个功能比较强大,Windows下多种应用软件都是用它做的。可惜现在Borland把Delphi卖了,用Delphi的人也少了。
一、算法的基础知识
1.用计算机解决问题的步骤:
① 分析问题
② 算法设计
③ 描述算法
④ 编程实现
从上面的求解问题过程可以看出,关键在于前三步的解决:第一步就是解决模型的数据结构,第二步是解决问题的算法,第三步是形式化地描写算法。
2.算法的定义:
算法是一组有穷的规则,它们规定了解决某一特定类型问题的一系列运算。算法可以理解为:程序(数据处理)+ 数据结构(数据组织)。
3.算法的性质:
① 有限性
② 确定性
③ 输入输出(可以没有输入,但一定有输出)
④ 可行性
常见的算法有:穷举法、迭代法、递推法、递归法、回溯法、深度及广度搜索法、动态规划、构造法等等。
2N-S图:
1973年,美国学者INassi和BShneiderman提出了一种用图形表示算法的方法,称为N-S流程图。N-S图包括顺序、选择和循环三种基本结构。
3程序设计语言:
计算机中的语言分为低级语言和高级语言,而低级语言又分为机器语言和汇编语言。
机器语言是一种CPU的指令系统,它是CPU可以识别的一系列有0和1这种二进制代码组成的指令。它依赖于机器,不同类型的计算机有不同的机器语言,机器语言的程序有许多机器指令组成,每条指令由操作码和地址码组成,数据和指令都放在不同的地址单元中。
汇编语言它是一种符号语言,为了克服机器语言固有的缺陷,20世纪50年代中期出现,将难以记忆和辨别的机器语言操作码用有意义的英文单词作为“助记符”来代替0、1进行编程。
高级语言,不再面向机器,而是接近人类的自然语言。常见的还有C/C++,Pascal,Basic,Java等。
数据类型、常量、变量及说明方法
数据类型确定了该类型数据项的表示、取值范围以及所能参与的运算。在pascal语言中,无论常量还是变量都必须属于一个确定的数据类型。
Pascal 提供了丰富的数据类型,可以分为三大类:
① 简单类型:分为标准类型(整型、实型、字符型和布尔型)和自定义类型(枚举型和子界型)
② 构造类型:分为数组类型、集合类型、记录类型和文件类型
③ 指针类型
这些数据类型中除了指针类型是动态数据类型外,其他的都是静态数据类型。另外,我们把整型、字符型、布尔型、枚举型和子界型称为顺序类型。
另:数据结构
-栈 队列
– 并查集
– 堆
– 字母树 线段树 平衡树 动态树
– 块状链表
– 后缀数组
– ……
栈
– 先进后出
队列
– 先进先出
常见的应用有哪些?
– 表达式求值
– 搜索
深搜
广搜
– 优化
集合用代表元表示
– representativeGetfather(x)
初始的时候,所有元素各自成为一个集合
– for i1 to N
father[i]i
判断是否在同一集合
– 代表元是否相同
return Getfather(x)=Getfather(y)
合并两个集合
– 将其中一集合的代表元指向另一集合代表元
father[Getfather(x)]y
并查集
如何寻找代表元?
– Getfather(x)
if father[x]=x
– return x
return Getfather(father[x])
如何优化?
– 路径压缩
Getfather(x)
– if father[x]=x
>>return x
– father[x]Getfather(father[x])
– return father[x]
用途
– 用于寻找最值
大根堆、小根堆
小根堆性质
– 是一棵完全二叉树
i的父亲是谁?
– idiv 2
i的左右儿子是谁?
– 2i和2i+1
– 树上的每棵子树,儿子的值不小于根
堆排序
– 建堆
– 取出根
– 删除根
– 反复取、删的过程
时间效率
– O(Nlog N)
块状数组
增加一下题目内容
– 询问区间最大值
– 询问区间和
– 询问区间内的和最大连续串
– 可以修改一个数
– 可以将一串连续的数变为一个值
– 可以将一串连续的数旋转一下
块状数组块状链表
– 可以将一串连续的数翻转一下
可能有些难
用free pascal测试过,100%正确的程序
var n,w,h,a,m,i:longint;
begin
read(n,w,h); //读入火柴根数、盒子的长和宽
m:=trunc(sqrt(sqr(w)+sqr(h))); //利用勾股定理算出最长(斜着放)能放的长度
for i:=1 to n do
begin
read(a); //读入火柴长度
if a<=m then writeln('DA') else writeln('NE'); //如果火柴能放进盒子,则输出DA,反之输出NE
end;
end
1、集合元素应该用[]括起来,所以这一句应该改成
while not([nxt] in s)
这样就没问题了。
2、程序中所有的nxt in s都改成[nxt] in s,这样子第一次循环时2这个元素就已经从集合中删除了。
关于集合的介绍,也许对你有帮助:
集合是由具有某些共同特征的元素构成的一个整体。在pascal中,一个集合是由具有同一有序类型的一组数据元素所组成,这一有序类型称为该集合的基类型。
(一)集合类型的定义和变量的说明
集合类型的一般形式为:
set of <基类型>;
说明: ①基类型可以是任意顺序类型, 而不能是实型或其它构造类型。同时,基类型的数据的序号不得超过255。例如下列说明是合法的:
type letters=set of 'A''Z';
numbers=set of 09;
s1=set of char;
ss=(sun,mon,tue,wed,thu,fri,sat);
s2=set of ss;
②与其它自定义类型一样, 可以将类型说明与变量说明合并在一起如:
type numbers=set of 09;
var s:numbers;
与 var s:set of 09;等价。
(二)集合的值
集合的值是用"〔"和"〕"括起来,中间为用逗号隔开的若干个集合的元素。如:
[] 空集
[1,2,3]
['a','e','i','o','u']
都是集合。
说明:
①集合的值放在一对方括号中,各元素之间用逗号隔开。
②在集合中可以没有任何元素,这样的集合称为空集。
③在集合中,如果元素的值是连续的,则可用子界型的表示方法表示。例如:
〔1,2,3,4,5,7,8,9,10,15〕
可以表示成:
〔15,710,15〕
④集合的值与方括号内元素出现的次序无关。例如,〔1,5,8 〕和〔5,1,8〕的值相等。
⑤在集合中同一元素的重复出现对集合的值没有影响。例如,〔1,8,5,1,8〕与〔1,5,8〕的值相等。
⑥每个元素可用基类型所允许的表达式来表示。如〔1,1+2,4〕、〔ch〕、〔succ(ch)〕。
(三)集合的运算
⒈赋值运算
只能通过赋值语句给集合变量赋值,不能通过读语句赋值,也不能通过write(或writeln)语句直接输出集合变量的值。
⒉集合的并、交、差运算
可以对集合进行并、交、差三种运算,每种运算都只能有一个运算符、两个运算对象,所得结果仍为集合。三种运算符分别用"+"、"*"、"-"表示。注意它们与算术运算的区别。
⒊集合的关系运算
集合可以进行相等或不相等、包含或被包含的关系运算,还能测试一个元素是否在集合中。所用的运算符分别是:=、<>、>=、<=、in
它们都是二目运算,且前4个运算符的运算对象都是相容的集合类型,最后一个运算符的右边为集合,左边为与集合基类型相同的表达式。
1
bak文件是PASCAL的程序备份文件
exe是PASCAL编译器(FPC)编译以后的可执行文件。
pas是PASCAL的程序文件
o是FPC的编译信息
pas一般是PASCAL程序的保存文件的后缀名,程序会被PASCAL默认保存在这里, 但是也有pp这样的文件后缀名,一般LAZARUS使用pp
2
"LARZA……什么的"应该是LAZARUS,是NOIP官方推荐的FPC 204的Windows下的编程界面(IDE)。
Windows中的PASCAL程序与Linux中的程序不同, 需要考虑字母大小写的问题, Windows对字母大小不敏感, 也就是在Windows下a和A是一样的,但是在Linux中,a和A却不一样, 所以在NOIP中, 一定要按照题目的要求写文件,不能随意的建立文件夹或是建立与题目不符的文件。
3
如果想用DOS下的PASCAL IDE(也就是所谓的"PAS那种兰色的编写界面")的话, 只要将pas文件拖到fpexe或是其他版本的PASCAL的主程序中即可。
在NOIP中一般只要求用Free Pascal和Lazarus编程,所以你应该使用的Free Pascal。它的主程序(20以前)一般在:X:\pp\bin\go32v2(或者win32)\fpexe
20版本以后的目录在:X:\pp\bin\i386-win32\fpexe
X是FP的安装目录
1、Pascal是一种计算机通用的高级程序设计语言。它由瑞士Niklaus Wirth教授于六十年代末设计并创立。
以法国数学家命名的Pascal语言现已成为使用最广泛的基于DOS的语言之一,其主要特点有:严格的结构化形式;丰富完备的数据类型;运行效率高;查错能力强。
2、组成部分
(1)程序首部
例11的第一行称为程序首部。program是保留字,接着是程序名(由你依据“标示符”规则自行定义),最后以分号表示程序首部结束,下面是程序主体的开始。程序首部在一个Turbo Pascal(仅在Turbo Pascal中有效)程序中并非必须出现,它是可选的。写上它仅起了文档作用。因此,在时间有限的情况下,如果用Turbo Pascal编程完全可以省略程序首部。
(2)程序体 a说明部分
说明部分用于定义和说明程序中用到的数据,由单元说明、标号说明、常量说明、类型说明、变量说明、函数或过程说明组成,并且这些数据的说明次序必须按照以上次序。但是一个简单的Turbo Pascal程序也可以不包含说明部分,也就是说说明部分是可选的。
b执行部分
执行部分描述了程序要执行的操作。它必须以一个Turbo Pascal保留字begin开始,以保留字end后跟句点结束,其间是一些执行具体操作的语句,并且以分号作为语句之间的分隔符。begin 和end必须成对出现,这是一个Turbo Pascal程序所必须有的。紧跟end之后的句号表示执行部分的结束,也表示整个程序的结束。此后的任何语句都无效。Turbo Pascal规定紧随end之前出现的分号允许省略。
(3)一个完全的Pascal程序结构
program 程序名;
uses
已知单元说明;
label
标号说明;
const
常量说明;
type
类型说明;
var
变量说明;
function
函数说明;
procedure
过程说明;
begin
语句;
语句;
……
语句
end
3、一)常量
在程序运行过程中,其值不能被改变的量称为常量。如123,14588,'abc',true等。
⒈整型常量
整型常量采用我们平常使用的十进制整数表示。如138,0,-512等都是整型常量,而18或180都不是整型常量。
pascal中有一个标准标识符Maxint,它代表所使用的计算机系统允许的最大整型数,而最小的整型数即为-Maxint-1。
Turbo Pascal还定义了长整数常量MaxLongInt,其值为2147483647。
⒉实型常量
实型常量包括正实数、负实数和实数零。pascal中表示实型常量的形式有两种。
⑴十进制表示法
这是人们日常使用的带小数点的表示方法。
如00,-00,+561,-80,-6050等都是实型常量,而0,37都不是合法的实数形式。
⑵科学记数法
科学记数法是采用指数形式的表示方法,如125×105可表示成125E+05。在科学记数法中,字母"E"表示10这个"底数",而E之前为一个十进制表示的小数,称为尾数,E之后必须为一个整数,称为"指数"。如-123456E+26 , +0268E-5 , 1E5是合法形式,而34E12 , 2E5 , E5 ,E,12E+05都不是合法形式的实数。
无论实数是用十进制表示法还是科学表示法,它们在计算机内的表示形式是一样的,总是用浮点方式存储。
和整数相比,实数能表示的范围大得多,但值得注意的是实数的运算整数的运算速度慢且无法像整数那样精确表示,只能近似表示。 ⒊字符常量
在Pascal语言中,字符常量是由单个字符组成,所有字符来自ASCII字符集,共有256个字符。在程序中,通常用一对单引号将单个字符括起来表示一个字符常量。如:'a','A','0'等。特殊地,对于单引号字符,则要表示成''''。对于ASCII字符集中,按每个字符在字符集中的位置,将每个字符编号为0-255,编号称为对应字符的序号。
4.布尔常量
布尔型常量仅有两个值,真和假,分别用标准常量名true和false表示。它们的序号分别为1和0。
5.符号常量
一个常量即可以直接用字面形式表示(称为直接常量, 如 124,1568),也可以用一个标识符来代表一个常量,称为"符号常量"。但符号常量必须在程序中的说明部分定义,也就是说先定义,后使用。
定义符号常量的一般格式:
CONST
<常量标识符>=<常量>
说明:常量说明部分以关键字const开头, 后面的标识符为常量标识符,其中"="号后的常量为整数、实数、字符、字符串(字符、字符串常量在后面章节中将作介绍)。而且,在常量说明部分可以将几个常量说明成符号常量,共用一个关键字"const"。例如:
则在本程序中pi和zero作为符号常量,分别代表实数314159和整数0。也就是说,常量说明部分既定义了常量名及其值,又隐含定义了常量的类型。 关于符号常量,应注意下列几点:
⑴符号常量一经定义,在程序的执行部分就只能使用该常量标识符,而不能修改其值。
⑵使用符号常量比直接用数值更能体现"见名知义"的原则,也便于修改参数,故一个较好的程序中,应尽量使用符号常量,在执行部分基本上不出现直接常量。
4、Pascal 提供了丰富的数据类型,这些数据类型可以分为三大类:简单类型、构造类型和指针类型,其中简单类型可以分为标准类型(整型、实型、字符型和布尔型)和自定义类型(枚举型和子界型),构造类型可以分为数组类型、集合类型、记录类型和文件类型。这些数据类型中除了指针类型是动态数据类型外,其他的都是静态数据类型。在这些数据类型中简单类型都是有序类型,除了实型以外的简单类型都是顺序类型,所谓顺序类型就是他们的值不仅是有序的而且是有顺序号。
PASCAL一点也不难学它应该是介于BASIC和C之间的高级语言。
program jishu;
var
n:integer;
function pos(x:integer):integer;
var i:integer;
begin
result:=1;
for i:=1 to x div 2 do
result:=result+pos(i);
end;
begin
readln(n);
writeln(pos(n));
readln
end
欢迎分享,转载请注明来源:表白网
评论列表(0条)