JavaScript:一道约瑟夫环面试题

约瑟夫问题求解

约瑟夫问题:N个人围成一圈,第一人从1开始报数,数到M的人出列,下一个人再从1开始报数,直到最后一个人,请写出算法。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>约瑟夫问题求解</title>
</head>
<body style="margin:0; padding:0 10px;">
<p>约瑟夫问题:N个人围成一圈,第一人从1开始报数,数到M的人出列,下一个人再从1开始报数,直到最后一个人,请写出算法。</p>
<script language="javascript">
function demo(){
    var n,m;
    var str1 = "输入信息格式有误!请重新输入信息!";
    var str2 = "输入信息不能为空!请重新输入信息!";
    var nm = prompt("请输入正整数N和M的值,以半角逗号分隔。" , "");
    if(nm){
        nm = nm.replace(/(^\s*)|(\s*$)/g,"");
        var ax = nm.split(",");
        var len = ax.length;
        if(len==2){
            if(isNaN(ax[0]) || isNaN(ax[1]) || ax[0]==0 || ax[1]==0){
                alert(str1); demo(1); return;
            }else{
                n = parseInt(ax[0]); m = parseInt(ax[1]);
                document.write("您输入的N="+n+",M="+m+".具体流程如下:<br/><br/>");
            }
        }else{ alert(str1); demo(1); return; }
    }else{
        if(nm==""){ alert(str2); demo(1); }
        return;
    }
    var arr = new Array();
    for(var i=0; i<n; i++){
        arr.push(i+1);
    }
    var t=0,loop=0;
    document.write("原数组:"+arr+"<br/>");
    while(arr.length > 1){
        t = (t + m - 1) % arr.length;
        arr.splice(t,1); //删除此人
        loop++;
        document.write("第 "+loop+" 趟:"+arr+"<br/>");
    }
}</script>
<input type="button" onclick="demo();" value="查看执行过程" />
</body>
</html>

 

posted @ 2012-11-19 17:13  丰在  阅读(105)  评论(0)    收藏  举报