您现在的位置:小学生自学网>> 信息>> 学习电脑

3列举(枚举)法

作者: 来源: 发布时间:2009年01月14日 点击数:
 

枚举( 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.

上一篇:2排序算法

下一篇:4归纳