2、转义字符、圆括号、花括号
3、注释
4、可视化表示形式、流程图、菱形符号
5、语句、复合语句
6、语法错误、逻辑错误
7、优先级
8、值
9、赋值运算符
10、类型转换
11、实参、形参
12、十进制整数
13、库函数
14、计数控制重复、标志控制重复
15、初始化
16、初始值、基础案例
17、算术表达式
18、编译
19、顺序、选择、循环
20、自顶向下、逐步求精
21、递归函数
22、迭代
23、函数原型
24、自定义头文件
25、按值调用、引用调用
26、存储类、数据类型
27、数组名就是数组地址
28、一个C程序,不管大小,都包含函数和变量
29、学习一种新的编程语言的唯一方法就是用它来写程序。
B.插入排序:思路:当前a[1]..a[i-1]已排好序了,现要插入a[i]使a[1]..a[i]有序。
procedure insert_sort
var i,j:integer
begin
for i:=2 to n do begin
a[0]:=a[i]
j:=i-1
while a[0]a[j] then swap(a[i],a[j])
end
D. 冒泡排序
procedure bubble_sort
var i,j,k:integer
begin
for i:=1 to n-1 do
for j:=n downto i+1 do
if a[j]r) or (a[i]<=a[j])) {满足取左边序列当前元素的要求}
then begin
tmp[t]:=a[i]inc(i)
end
else begin
tmp[t]:=a[j]inc(j)
end
inc(t)
end
for i:=p to r do a[i]:=tmp[i]
end{merge}
procedure merge_sort(var a:listtypep,r: integer){合并排序a[p..r]}
var q:integer
begin
if p<>r then begin
q:=(p+r-1) div 2
merge_sort (a,p,q)
merge_sort (a,q+1,r)
merge (a,p,q,r)
end
end
{main}
begin
merge_sort(a,1,n)
end.
G.基数排序
思想:对每个元素按从低位到高位对每一位进行一次排序
五、高精度计算
高精度数的定义:
type
hp=array[1..maxlen] of integer
1.高精度加法
procedure plus ( a,b:hpvar c:hp)
var i,len:integer
begin
fillchar(c,sizeof(c),0)
if a[0]>b[0] then len:=a[0] else len:=b[0]
for i:=1 to len do begin
inc(c[i],a[i]+b[i])
if c[i]>10 then begin dec(c[i],10)inc(c[i+1])end{进位}
end
if c[len+1]>0 then inc(len)
c[0]:=len
end{plus}
2.高精度减法
procedure substract(a,b:hpvar c:hp)
var i,len:integer
begin
fillchar(c,sizeof(c),0)
if a[0]>b[0] then len:=a[0] else len:=b[0]
for i:=1 to len do begin
inc(c[i],a[i]-b[i])
if c[i]<0 then begin inc(c[i],10)dec(c[i+1])end
while (len>1) and (c[len]=0) do dec(len)
c[0]:=len
end
3.高精度乘以低精度
procedure multiply(a:hpb:longintvar c:hp)
var i,len:integer
begin
fillchar(c,sizeof(c),0)
len:=a[0]
for i:=1 to len do begin
inc(c[i],a[i]*b)
inc(c[i+1],(a[i]*b) div 10)
c[i]:=c[i] mod 10
end
inc(len)
while (c[len]>=10) do begin {处理最高位的进位}
c[len+1]:=c[len] div 10
c[len]:=c[len] mod 10
inc(len)
end
while (len>1) and (c[len]=0) do dec(len){若不需进位则调整len}
c[0]:=len
end{multiply}
4.高精度乘以高精度
procedure high_multiply(a,b:hpvar c:hp}
var i,j,len:integer
begin
fillchar(c,sizeof(c),0)
for i:=1 to a[0] do
for j:=1 to b[0] do begin
inc(c[i+j-1],a[i]*b[j])
inc(c[i+j],c[i+j-1] div 10)
c[i+j-1]:=c[i+j-1] mod 10
end
len:=a[0]+b[0]+1
while (len>1) and (c[len]=0) do dec(len)
c[0]:=len
end
5.高精度除以低精度
procedure devide(a:hpb:longintvar c:hpvar d:longint)
{c:=a div bd:= a mod b}
var i,len:integer
begin
fillchar(c,sizeof(c),0)
len:=a[0]d:=0
for i:=len downto 1 do begin
d:=d*10+a[i]
c[i]:=d div b
d:=d mod b
end
while (len>1) and (c[len]=0) then dec(len)
c[0]:=len
end
6.高精度除以高精度
procedure high_devide(a,b:hpvar c,d:hp)
var
i,len:integer
begin
fillchar(c,sizeof(c),0)
fillchar(d,sizeof(d),0)
len:=a[0]d[0]:=1
for i:=len downto 1 do begin
multiply(d,10,d)
d[1]:=a[i]
while(compare(d,b)>=0) do {即d>=b}
begin
Subtract(d,b,d)
inc(c[i])
end
end
while(len>1)and(c.s[len]=0) do dec(len)
c.len:=len
end
六、 树的遍历
1.已知前序中序求后序
procedure Solve(pre,mid:string)
var i:integer
begin
if (pre='''') or (mid='''') then exit
i:=pos(pre[1],mid)
solve(copy(pre,2,i),copy(mid,1,i-1))
solve(copy(pre,i+1,length(pre)-i),copy(mid,i+1,length(mid)-i))
post:=post+pre[1]{加上根,递归结束后post即为后序遍历}
end
2.已知中序后序求前序
procedure Solve(mid,post:string)
var i:integer
begin
if (mid='''') or (post='''') then exit
i:=pos(post[length(post)],mid)
pre:=pre+post[length(post)]{加上根,递归结束后pre即为前序遍历}
solve(copy(mid,1,I-1),copy(post,1,I-1))
solve(copy(mid,I+1,length(mid)-I),copy(post,I,length(post)-i))
end
3.已知前序后序求中序的一种
function ok(s1,s2:string):boolean
var i,l:integer p:boolean
begin
ok:=true
l:=length(s1)
for i:=1 to l do begin
p:=false
for j:=1 to l do
if s1[i]=s2[j] then p:=true
if not p then begin ok:=falseexitend
end
end
procedure solve(pre,post:string)
var i:integer
begin
if (pre='''') or (post='''') then exit
i:=0
repeat
inc(i)
until ok(copy(pre,2,i),copy(post,1,i))
solve(copy(pre,2,i),copy(post,1,i))
midstr:=midstr+pre[1]
solve(copy(pre,i+2,length(pre)-i-1),copy(post,i+1,length(post)-i-1))
end
七 进制转换
1.任意正整数进制间的互化
除n取余
2.实数任意正整数进制间的互化
乘n取整
3.负数进制:
设计一个程序,读入一个十进制数的基数和一个负进制数的基数,并将此十进制数转换为此负进制下的数:-R∈{-2,-3,-4,....-20}
八 全排列与组合的生成
1.排列的生成:(1..n)
procedure solve(dep:integer)
var
i:integer
begin
if dep=n+1 then begin writeln(s)exitend
for i:=1 to n do
if not used[i] then begin
s:=s+chr(i+ord(''0''))used[i]:=true
solve(dep+1)
s:=copy(s,1,length(s)-1)used[i]:=false
end
end
2.组合的生成(1..n中选取k个数的所有方案)
procedure solve(dep,pre:integer)
var
i:integer
begin
if dep=k+1 then begin writeln(s)exitend
for i:=1 to n do
if (not used[i]) and (i>pre) then begin
s:=s+chr(i+ord(''0''))used[i]:=true
solve(dep+1,i)
s:=copy(s,1,length(s)-1)used[i]:=false
end
end
九.查找算法
1.折半查找
function binsearch(k:keytype):integer
var low,hig,mid:integer
begin
low:=1hig:=n
mid:=(low+hig) div 2
while (a[mid].key<>k) and (low<=hig) do begin
if a[mid].key>k then hig:=mid-1
else low:=mid+1
mid:=(low+hig) div 2
end
if low>hig then mid:=0
binsearch:=mid
end
2.树形查找
二叉排序树:每个结点的值都大于其左子树任一结点的值而小于其右子树任一结点的值。
查找
function treesrh(k:keytype):pointer
var q:pointer
begin
q:=root
while (q<>nil) and (q^.key<>k) do
if kgoal then begin {若未移到目标}
Move(k-1,6-now-goal) {剩下的先移到没用的柱上}
Writeln(k moved from now to goal)
H[goal,h[goal,0]+1]:=h[now,nowp]h[now,nowp]:=0
Inc(h[goal,0])dec(h[now,0])
Move(k-1,goal){剩下的移到目标上}
End
十二、DFS框架
NOIP2001 数的划分
procedure work(dep,pre,s:longint){入口为work(1,1,n)}
{dep为当前试放的第dep个数,pre为前一次试放的数,s为当前剩余可分的总数}
var j:longint
begin
if dep=n then begin
if s>=pre then inc(r)exit
end
for j:=pre to s div 2 do work(dep+1,j,s-j)
end
类似:
procedure try(dep:integer)
var i:integer
begin
if dep=k then begin
if tot>=a[dep-1] then inc(sum)
exitend
for i:=a[dep-1] to tot div 2 do begin
a[dep]:=idec(tot,i)
try(dep+1)
inc(tot,i)
end
end{try}
十三、BFS框架
IOI94 房间问题
head:=1tail:=0
while tail=1) and (I<=L.len) then
while j<I do begin p:=p^.nextinc(j)end
loc:=p
end
2.单链表的插入 *** 作
procedure insert(L:linklistI:integerx:datatype)
var p,q:pointer
begin
p:=loc(L,I)
new(q)
q^.data:=x
q^.next:=p^.next
p^.next:=q
inc(L.len)
end
3.单链表的删除 *** 作
procedure delete(L:linklistI:integer)
var p,q:pointer
begin
p:=loc(L,I-1)
q:=p^.next
p^.next:=q^.next
dispose(q)
dec(L.len)
end
4.双链表的插入 *** 作(插入新结点q)
p:=loc(L,I)
new(q)
q^.data:=x
q^.pre:=p
q^.next:=p^.next
p^.next:=q
q^.next^.pre:=q
5.双链表的删除 *** 作
p:=loc(L,I){p为要删除的结点}
p^.pre^.next:=p^.next
p^.next^.pre:=p^.pre
dispose(p)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)