经典算法题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号。

选班长

  • 题目:
      • 思路:
  • 实现方法:
    • 1.创建一个数组,将所有人存入该数组,并给它们都标记为true
    • 2.定义一个报数器(counter)和一个计数器(register)。
    • 3.最后我们利用循环来找出最后一个被选中的人,并把它以弹框的形式输出
  • 完整代码如下:

题目:

题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号(假设班上有20人)。

思路:

  1.首先:我们可以先将班上的人(20人)做标记装进一个数组里,每当报到3时,将这个人做标记,然后跳过继续报数,直到最后一个人时,将他取出。
  2.我们可以将每个数组初始化值都变为true,如果有20个人,那么数组中存储的值就是20个true,相当于人还在圈子里
  3.每次标记一个元素,我们就把该元素的值标记为false(这里我们规定,值不为false的元素就表示人还在里面)

实现方法:

1.创建一个数组,将所有人存入该数组,并给它们都标记为true

代码如下:

 var a=new Array(20);
        for(var i=0;i<a.length;i++){
     
            a[i]=true;
        } 

2.定义一个报数器(counter)和一个计数器(register)。

为什么要分别定义一个报数器和一个计数器呢?
  1.计数器是用来判断,后面三个数标记为true时,将第三个标记为true的进行更改。也就相当于报数报到3时,退出圈子。
  2.报数器是用来在外层循环做判断用的,当报数器的数字小于数组长度减一时,也就是刚好只剩下最后一个数时,停止循环。
代码如下:

var counter=0,register=0;//报数器,计数器
        while(register<a.length-1){
     
            for(var i=0;i<a.length;i++){
     
                if(a[i]){
     
                    counter++;
                    if(counter==3){
     
                        counter=0;
                        register++;
                        a[i]=false;
                    }
                }
            }
            
        }

3.最后我们利用循环来找出最后一个被选中的人,并把它以弹框的形式输出

for(var i=0;i<a.length;i++){
     
            if(a[i]){
     
                alert("班长是第"+(i+1)+"号学生");
            }
        }

思考: 为什么被选中后的学生是第(i+1)个呢?
  1.数据存入数组中,数组的下标是从0开始计算的,虽然被选中的人是第i个,但实际上是第(i+1)个人。
  2.可以利用控制台打印数组来查看被选中的人(console.log(a))

完整代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /* 题目:有n个人围成一圈,顺序排号。从第一个人开始报数
        (从1到3报数),凡报到3的人退出圈子,
        问最后留下的是原来第几号的那位。  */
        var a=new Array(25);
        for(var i=0;i<a.length;i++){
     
            a[i]=true;
        }
        var counter=0,register=0;//报数器,计数器
        while(register<a.length-1){
     
            for(var i=0;i<a.length;i++){
     
                if(a[i]){
     
                    counter++;
                    if(counter==3){
     
                        counter=0;
                        register++;
                        a[i]=false;
                    }
                }
            }
            
        }
        console.log(a);
        for(var i=0;i<a.length;i++){
     
            if(a[i]){
     
                alert("班长是第"+(i+1)+"号学生");
            }
        }
        

       
    </script>
</body>
</html>

页面弹框显示:
经典算法题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号。_第1张图片
控制台显示:
在这里插入图片描述

你可能感兴趣的:(javascript,javascript)