首先我们看一下原题
7331是一个特殊的质数,因为我们去掉个位得到的733是一个质数;再次去掉个位得到的73又是一个质数;再去掉个位后得到的7依然是一个质数。对于形似这种的质数,我们称呼它为特殊质数。写一个程序对给定的待求特殊质数的位数 N (1≤N≤8)求出所有对应位数的特殊质数(注意:数字1不被看作一个质数)。输入包括一个整数,为待求特殊质数的位数 N。输出长度为N的特殊质数列表,每行一个。
看到这道题我们首先分析一下什么是质素。质数就是只能被一和自身整除的数,题目要求去掉各位之后仍然是是质数,所以最高位必须是质数,所以我们定义一个最高位满足条件的质数数组 var tiptop=[2,3,5,7];除了最高位后面的数那肯定是以奇数结尾的,但是以5结尾的数是能被5整除的,所以定义后面位数出现的数的数组为 var afterNum=[1,3,7,9] 。
首先我们写一个方法判断这个数是否是质数。代码如下
/** * 判断数是否是质素 * @param data 输入的数 * @returns {boolean} 输出是否是质素 */ function judgeZhiSu(data) { if (typeof data != 'number') { console.log("判断的对象不是数字"); return false; } if (data <= 0) { console.log("请输入大于0的正数"); return false; } if (data == 1) { return false; } if (!(/^[0-9]*[1-9][0-9]*$/.test(data.toString()))) { console.log('请输入整数'); return false; } var len = Math.floor(data / 2); for (var i = 2; i <= len; i++) { if (data % i == 0) { return false; } } return true; }
接着我们就要开始计算数据是否满足题目的条件,其中我们会在方法的内部定义一个递归方法
/** * 输入位数,输出满足条件的所有特殊质素 * @param len 位数长度 1<=len<=8 */ function computeMain(len) { if (typeof len != 'number') { console.log("判断的对象不是数字a"); return; } if (len < 1 || len > 8) { console.log("请输入大于等于1小于等于8的整数"); return; } if (!(/^[0-9]*[1-9][0-9]*$/.test(len.toString()))) { console.log('请输入整数'); return; } var dataArr = []; var tiptop = [2, 3, 5, 7]; var afterNum = [1, 3, 7, 9]; for (var i = 0, arrLen = tiptop.length; i < arrLen; i++) { recurrence(tiptop[i],1); } /** * 递归计算 * @param num 前几位满足条件的数据 * @param leve 已经多少位了 */ function recurrence(num, leve) { if(leve==len){ dataArr.push(num); return; } for(var i= 0,aLen=afterNum.length;i<aLen;i++){ if(judgeZhiSu((num+''+afterNum[i])*1)){ recurrence((num+''+afterNum[i])*1,leve+1) } } } return dataArr; }