手机版

用javascript实现Emrips反时间枚举的示例代码

时间:2021-09-02 来源:互联网 编辑:宝哥软件园 浏览:

今天看到一个武士刀,提出了“emirps”的概念:一个质数反过来得到一个不同的质数,叫做“emirps”。

例如,13和17是素数,31和71是素数,13和17是“emirps”。但是质数757,787,797是回文质数,也就是说倒过来的数和原来的数是一样的,所以不认为是“emirps”。

标题要求写一个函数,输入正整数n,返回小于n的“emirps”个数,包括最大“emirps”和所有小于n的“emirps”之和。

解决问题的思路是枚举所有小于n的质数,然后剔除回文质数和逆序后为合数的数。

先写判断素数的函数

主要基于三个数学结论:

所有的合数都是几个素数的乘积

如果一个数可以因子分解,那么两个因子必须一个小于或等于sqrt(n),一个大于或等于sqrt(n)。

所有大于3的素数都是6X 1或6X-1的形式,即6的倍数的相邻数,但不是所有的6X 1或6X-1都是素数。

第一个结论可以用反证来证明

第三个结论证明:

我们把数字表示为:6X-1、6X、6X 1、6X 2、6X 3、6X 4 (X为正整数)6X=2 * 3x 6 x2=2(3x 1)6X 3=3(2x 1)6X 4=2(3x 2),可以证明这些数字绝对不是素数,即素数只能是6X-1或6X-1。

代码:

函数isPrimeNumber(num){ if(num==2 | | num==3){返回true}/* 2,3特殊处理*/if (num% 6!=1 num % 6!=5){返回false}/*根据结论3排除*/对于(var I=5;I=Math . sqrt(num);I=6){ if(num % I==0 | | num %(I ^ 2)=0 } { return false;}}/*根据结论2和结论3排除*/返回true}然后去掉回文质数和反转后的复合数

代码:

函数emirpnound(num){ var reversennumber=Number(String(num))。拆分(“”)。反转()。如果(reverseNumber!=num isPrimeNumber(reverse number)){ return true;} else { return false}}最终输出想要的结果

代码:

函数findEmirp(n){ var emirpGrouP=[];for(var I=1;在;I){ if(isPrimeNumber(I)EmirpNumber(I)){ EmirpGrouP . push(I);}} return ['n '是:' n ',quantity是:' emirpGroup.length ',最大数字:' EmirpGrouP[EmirpGrouP . length-1],' sum:' emirpgroup.reduce(函数(total,current){ return total current;})]}查看输出结果和运行时间

n=1000000:

n=10000000:

以上用javascript实现Emrips反素数枚举的示例代码是边肖与大家分享的全部内容。希望能给大家一个参考,支持我们。

版权声明:用javascript实现Emrips反时间枚举的示例代码是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。