特殊质数js实现

6 篇文章 0 订阅

首先我们看一下原题

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值