给出一个区间[a, b],计算区间内“神奇数”的个数。
神奇数的定义:存在不同位置的两个数位,组成一个两位数(且不含前导0),且这个两位数为质数。
比如:153,可以使用数字3和数字1组成13,13是质数,满足神奇数。同样153可以找到31和53也为质数,只要找到一个质数即满足神奇数。
输入描述:
输入为两个整数a和b,代表[a, b]区间 (1 ≤ a ≤ b ≤ 10000)。
输出描述:
输出为一个整数,表示区间内满足条件的整数个数
输入例子:
11 20
输出例子:
6
在网上看到的一些题,查找神奇数字,觉得蛮有趣,跟小时候做题一样,其实比较简单,但是还是把他记录下来吧。没有怎么优化过,也没有对边值和奇怪值进行处理,后续再说吧
/**
* 检测是否为质数
* @param {[type]} num [description]
* @return {[type]} [description]
*/
function isPrime(num){
num=parseInt(num);
//如果能整除2或者5且相加能被3整除都不用循环
if(num%2===0||num%3===0){
return false;
}
if(num%5===0&&num>=10){
return false;
}
for(var i=3;i<num/2;i++){
if(num%i===0){
return false;
}
}
return true;
}
/**
* 排列组合的可能
* @param {[type]} num [description]
* @return {[type]} [description]
* 比如 153 可以组合成15 13 和 51 53 以及 31 35
*/
function lineNum(num){
var stringNum=String(num);
var numArr=stringNum.split('');
var numLen=numArr.length;
var times=numLen*(numLen-1)
var allNum=[];
for(var i=0;i<numLen;i++){
for(var j=0;j<numLen;j++){
if(j!=i&&numArr[i]!=0){
allNum.push(numArr[i]+numArr[j])
}
}
}
return allNum;
}
/**
* 查找神奇数
* @param {[type]} a [description]
* @param {[type]} b [description]
* @return {[type]} [description]
*/
function findMagicNum(a,b){
var allMagics=[];
var times=0;
for(var i=a;i<=b;i++){
if(isPrime(i)&&allMagics.indexOf(i)<0){
allMagics.push(i);
times++;
}
else if(!isPrime(i)){
var numLine=lineNum(i)
for(var j=0;j<numLine.length;j++){
if(isPrime(numLine[j])&&allMagics.indexOf(i)<0){
allMagics.push(i);
times++;
}
}
}
}
return {
allMagics:allMagics,
num:times
}
}
var obj=findMagicNum(11, 20);
console.log(obj)
第二道
牛牛想对一个数做若干次变换,直到这个数只剩下一位数字。
变换的规则是:将这个数变成 所有位数上的数字的乘积。比如285经过一次变换后转化成285=80.
问题是,要做多少次变换,使得这个数变成个位数。
输入描述:
输入一个整数。小于等于2,000,000,000。
输出描述:
输出一个整数,表示变换次数。
输入例子:
285
输出例子:
2
var time=1;
function changeTime(num){
if(num<10){
time=0;
}else{
var stringNum=String(num);
var numArr=stringNum.split('');
var sum=1;
for(var i=0;i<numArr.length;i++){
sum*=numArr[i];
}
if(sum>10){
time++;
changeTime(sum)
}
}
return time;
}
console.log(changeTime(2869))
js实现三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
var threeSum = function(nums) {
var i,j,k,len=nums.length;
var arr=[],obj={};
for(i=0;i<len;i++){
for(j=i+1;j<len;j++){
for(k=i+2;k<len;k++){
if(nums[i]+nums[j]+nums[k]===0){
var arrItem=[];
let itemObj={};
arrItem.push(nums[i],nums[j],nums[k]);
arrItem.sort(function(a,b){return a-b})
let str=arrItem.join();
if(!obj[str]){
obj[str]=true;
arr.push(arrItem)
}
}
}
}
}
return arr
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。