枚举( enumerate)法是基于计算机运算速度快这一特性的一种使用非常普遍的思维方法。它是根据问题中的条件将可能的情况一一列举出来分析求解的方法。但有时一一列举出的情况数目很大,如果超过了我们所能忍受的范围则需要考虑如何去排除不合理的情况,尽可能减少列举的问题可能解的数目。
例:求一元三次方程的解。
有形如: ax3+bx2+cx+d=0一元三次方程。给出该方程中各项的系数 (a, b, c, d 均为实数 ),并约定该方程存在三个不同实根 (根的范围在 -100至 100之间 ),且根与根之差的绝对值 >=1。要求由小到大依次在同一行上输出这三个实根。
这道题的解法很多,最为简洁的方法就是直接枚举可能的实根解。
var a,b,c,d:real;i:integer;
function f(x:real):real;
begin
f:=a*x*x*x+b*x*x+c*x+d
end;
begin
readln(a,b,c,d);
for i:=-10000 to 10000 do {枚举方程所有可能的解}
if abs(f(i/100))<1e-4 then write(i/100:2:2,' ');
end.
题目:有M个猴子围成一圈,每个有一个编号,编号从1到M。打算从中选出一个大王。经过协商,决定选大王的规则如下:从第一个开始,每隔N个,数到的猴子出圈,最后剩下来的就是大王。
要求:从键盘输入M,N,编程计算哪一个编号的猴子成为大王。
program tt;
const n1=100;
var a:array [1..n1] of integer;
m,n,i,j,k:integer;
begin
write('input m,n:');readln(m,n);
for i:=1 to m do a[i]:=i;
i:=1; k:=0;
while i<m do
begin
j:=0;
while j<=n do
begin
j:=j+1;
k:=k+1;
if k>m then
begin
k:=1;
while a[k]=0 do k:=k+1;
end;
end;
a[k]:=0;
i:=i+1;
end;
i:=1;
while a[i]=0 do i:=i+1;
writeln('The king is ',i);
end.
题目:有M个人围成一圈,每人有一个编号,从编号为1的人开始,每隔N个出圈,按出圈次序排成一列,其编号刚好按顺序从1到M。
要求:从键盘输入M,N,编程计算并输出这M个人原来在圈中的位置。
题目:前N个自然数排成一串: X1,X2,X3.....Xn,先取出x1,将x2,x3移到数串尾,再取出x4,将x4,x6移到数串尾,....... 类推直至取完.
取出的序列恰好是:1,2,3......n.要求输入N,求原来的数串的排列方式.
var a:array[1..1000] of word;
n,i,j,dep:word;
begin
write('N(1-1000)=');
readln(n);
if (n=0) or (n>1000) then begin
writeln('Input error.');
readln;
halt;
end;
fillchar(a,sizeof(a),0);
a[1]:=1;
dep:=1;
for i:=2 to n do begin
j:=3;
while (j>0) do begin
dep:=dep mod n+1;
if a[dep]=0 then dec(j);
end;
a[dep]:=i;
end;
for i:=1 to n do write(a[i]:5);
writeln;
readln;
end.
问题:围绕着山顶有10个洞,狐狸要吃兔子,兔子说:“可以,但必须找到我,?我就藏身于这十个洞中,你从10号洞出发,先到1号洞找,第二次隔1个洞找,第三次隔2个洞找,以后如此类推,次数不限。”但狐狸从早到晚进进出出了1000次,仍没有找到兔子。问兔子究竟藏在哪个洞里?
【答案】2,4,7,9
【参考程序1】
const holenumber=10; var hole:array[0..holenumber] of 0..1; step,i,number:longint; begin for i:=0 to 9 do hole[i]:=0; number:=0; for step:=1 to 1000 do begin number:=number+step; {循环地数} i:=number mod holenumber; {第几个洞} hole[i]:=1; end; for i:=0 to holenumber-1 do if hole[i]=0 then write(i:3); readln; end.
【参考程序2】
const m=10; {洞数} var l,f,t:integer; a:array[1..m+1] of 0..1; begin for t:=1 to m do a[t]:=0; f:=0; t:=0; l:=0; repeat l:=l+1; {隔几个洞} t:=t+l; {第几个洞} if t>m+1 then t:=t mod m; if t=0 then t:=10;{循环地找} a[t]:=1;{该洞已进过} f:=f+1; {进洞的次数} until f=1000; for t:=1 to 10 do if a[t]=0 then write(t,' '); readln end.
五年级上册解方程练… | 255457 |
九连环图解解法 | 226890 |
wifi万能钥匙破解的… | 177863 |
纸飞机Skyking(空… | 170841 |
小学语文知识大全(… | 152076 |
各种鱼钩鱼线绑法与… | 117010 |
课题研究的方法有哪些 | 113473 |
人教版pep小学英语… | 104567 |
小学语文知识大全(… | 96818 |
人教版pep小学英语… | 96204 |
小学数学五年级上册… | 93450 |
人教版pep小学英语… | 82587 |
小学语文知识大全(… | 80412 |
笔记本电脑如何关闭… | 79825 |
小学生六一搞笑小品… | 78891 |
不打结的红领巾系法… | 78082 |