约瑟夫问题: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(); return; } }else{ if(nm==""){ alert(str2); demo(); } 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>