算法入门基础JS题解

目录

 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 

题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 

题目:输入某年某月某日,判断这一天是这一年的第几天?

题目:输出9 * 9口诀。

题目:要求输出国际象棋棋盘。

 题目:判断101-200之间有多少个素数,并输出所有素数。

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153 = 1的三次方+5的三次方+3的三次方。

题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

求s = a + aa + aaa + aaaa + aa...a的值,其中a是一个数字。例如2 + 22 + 222 + 2222 + 22222(此时共有5个数相加),几个数相加由键盘控制。

题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。

题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个   第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

题目:两个乒乓球队进行比赛,各出三人。甲队为a, b, c三人,乙队为x, y, z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x, z比,请编程序找出三队赛手的名单。

题目:有一分数序列:2 / 1, 3 / 2,5 / 3,8 / 5,13 / 8,21 / 13...求出这个数列的前20项之和。

题目:求1+2!+3!+...+20!的和

题目:利用递归方法求5!。

题目:输入一行字符串,以相反的顺序打印出来

题目: 给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

题目:判断是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。


 JavaScript解决:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

<script>
    // 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
    // 分析: 首先要明白质因数的概念     质因数: 分解成质数的乘积
    // 指定循环跑不掉 首先要输出质数  然后循环  
    // 输入一个整数判断是指数进行整数与质数相同是边界条件进行输出

    // 质数判断
    function isPrime(n) {
        // 首先判断n是不是<=1  <=1  不是素数 质数从2开始
        if (n <= 1) { return false }                 //不是素数直接返回false
        // 2~n-1 之间的所有整数
        for (let i = 2; i < n; i++) {                // 如果n除以 2~n-1 之间的所有整数 只要有一个能除尽,则为非素数
            if (n % i === 0) { return false }
        }                                            // 循环结束也没有符合条件的  说明是质数
        return true
    }

    function f(n) {
        let arr = []                                 // 声明一个数组 保存符合条件的质数
        function fn(n) {                             // 进行
            for (let i = 1; i <= n; i++) {
                if (isPrime(i) && (n % i === 0)) {   //i 是 1~n之间的素数 i既满足质数,又符合能被n整除
                    n = n / i;                       // 先改变变量
                    arr.push(i)                      // 能够进来这一步  证明i是约数,添加到数组里面
                    if (n !== 1) fn(n)               // 进行判断是否符合继续条件
                    break;                           // 终止循环   不能用return
                }
            }
            return arr                               // 返回数组
        }
        fn(n)                                        // 调用fn函数
        let result = n + '=' + arr.join('*')         // 数组转换为字符串并用*号链接
        return result
    }


</script>

题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 

// 题目分析   组成一个三位数 只有1234四个数 小于5
	//  用到for循环 并且 个十百的数字不能重复
	var i, j, k, n = 0;		//百十个
	for (i = 1; i < 5; i++) {
		for (j = 1; j < 5; j++) {
			for (k = 1; k < 5; k++)
				if (i != j && i != k && j != k) {
					n++;
					console.log(100 * i + 10 * j + k);
				}
		}
	}
	console.log('符合条件的个数为' + n + '个');

题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 

// 首先要了解什么是完全平方数    可以分为两个相同的数相乘 例如 9可以为分为 3*3   那么9就是完全平方数


	for (let i = 1; i < 2000; i++) {						//	i 是我们要得到的数
		for (let j = 1; j < 1000; j++) {
			if (i + 100 == j * j) {							//	i+100 符合  j*j  之后在进行循环k
				for (let k = 1; k < 1000; k++) {			//	循环k i+100+168  符合 k*k
					if (i + 100 + 168 == k * k) {
						console.log(i);						// 以上条件都满足输出i
					}
				}
			}
		}
	}

题目:输入某年某月某日,判断这一天是这一年的第几天?

function isDay() {
		let d = prompt('请输入要查询的日期, 比如2022/12/11');
		let d1 = new Date(d)				// 保存输入时间
		let arr = d.split('/')				// 字符串转数组 split()  数组转字符串 join()
		let d2 = new Date(`${arr[0]}/1/1`)	// 那一年的第一天
		let day = (d1.getTime() - d2.getTime()) / (1000 * 60 * 60 * 24)	//时间戳是毫秒数转换为天数
		return `今天是${arr[0]}的第${day + 1}天`
	}

题目:输出9 * 9口诀。

 // 有行有列双层for循环
    for (let i = 1; i <= 9; i++) {
        let result = ''         //外层控制行
        for (let j = 1; j <= i; j++) {      //内层控制列
            if (j === 3 && (i === 3 || i === 4)) {
                result += ' '    // 美化对齐
            }
            result += j + '*' + i + '=' + j * i + ' '


        }
        console.log(result);
    }

题目:要求输出国际象棋棋盘。

 let str = '<table cellpadding="0" cellspacing="0">';    // 创建一个表格
    let off = true;
    for (let i = 1; i <= 8; i++) {                          //行
        str += '<tr>';                                      // 生成表格行
        for (let j = 1; j <= 8; j++) {                      //列  每一行的每一列
            if (off) {                                      // 因为有黑白格交替,所以用个条件判断
                str += '<td class="td01"></td>'
                off = !off
            } else {
                str += '<td class="td02"></td>'
                off = !off
            }
        }
        off = !off                                          // 第一行结束后 反转
        str += '</tr>'
    }
    str += '</table>'                                       // 表格结束
    document.write(str)                                     // 书写文档流

 题目:判断101-200之间有多少个素数,并输出所有素数。


    // 先进性质数判断
    function isPrime(n) {
        if (n < 2) return false
        for (let i = 2; i < n; i++) {
            if (n % i === 0) return false
        }
        return true
    }

    // 循环101~200之间的所有数
    for (let i = 101; i <= 200; i++) {
        if (isPrime(i)) console.log(i + '是质数');
    }

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

 // 从第三个月开始以后的每月兔子数量都是前两月之和    和斐波那契数列一样
    function rabbit(n) {
        if (n === 1 || n === 2) {
            return 1
        } else {
            return rabbit(n - 1) + rabbit(n - 2)
        }
    }

    // 先输出两年的
    for (let i = 1; i <= 24; i++) {
        console.log('第' + i + '个月的兔子数是:' + rabbit(i));
    }

题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153 = 1的三次方+5的三次方+3的三次方。

  // 分析题目
    // 首先是三位数得出100~999这是范围
    // 其次是每个位数的立方和等于本身这是条件 153 = 1**3 + 5**3 +3**3

    for (let i = 100; i <= 999; i++) {
        // 首先要获得每个位数的值
        let bit = i % 10        //个位
        let ten = parseInt(i / 10) % 10   //十位   JS中的除法不是保留整数
        let hun = parseInt(i / 100)       //百位
        // 进行判断
        // console.log(bit, ten, hun);
        if ((bit ** 3 + ten ** 3 + hun ** 3) === i) {
            console.log(i + "是水仙花数");
        }

    }

    // 153 370 371 407

题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

  // 分析: 先了解最大公约数和最小公倍数的概念
    // 最大公约数肯定比这两个数小,最小公倍数肯定被这两个数大  (也可能是本身)
    // 首先判断m,n这两个的大小
    // 然后最大公约数从小的数开始往更小的方向去找
    // 最小公倍数从大的数王更大的方向去找

    function fn(m, n) {
        let max, min;
        if (m > n) {
            max = m
            min = n
        } else {
            max = n
            min = m
        }
        // console.log(max, min);
        // 最小公倍数  从大的值开始找
        while (true) {
            if (max % m === 0 && max % n === 0) {
                console.log('最小公倍数' + max);
                break
            }
            max++
        }
        // 最大公约数从小的值开始找
        while (true) {
            if (m % min === 0 && n % min === 0) {
                console.log('最大公约数' + min);
                break
            }
            min--
        }
    }
    fn(55, 66)

输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

  // 分析: 第一步是把输入的字符串一个一个单独分出来
    //      第二步进行判断,要知道怎么判断出是字母,数字或者其他
    //      输入的数据都是字符型  字符进行判断是判断asc编码 

    // 第一步我想到了两种方法
    // 一个是str[i]     // i是下标 需要用到for循环  或者用charAt(i)方法
    // 第二种是 for of迭代  也可以实现    下面这两种方法实现一下

    function isChar1() {
        // prompt() 浏览器会弹出一个输入框
        let str = prompt('请输入')
        // 需要统计数量
        let string = 0, number = 0, symbol = 0;
        for (let i = 0; i < str.length; i++) {
            // 判断是不是字母 a~z A~Z
            if (str[i] >= 'a' && str[i] <= 'z' || str[i] >= 'A' && str[i] <= 'Z') {
                string++
            } else if (str[i] >= '0' && str[i] <= '9') {  //判断数字
                number++
            } else {
                symbol++
            }
        }
        return ('字母有' + string + '个,数字有' + number + '个,其他符号有' + symbol + '个')
    }

    // 第二种方法 for of
    function isChar2() {
        // prompt() 浏览器会弹出一个输入框
        let str = prompt('请输入')
        // 需要统计数量
        let string = 0, number = 0, symbol = 0;
        //  用for of遍历
        for (let k of str) {  // k 是每一个元素
            if (k >= 'a' && k <= 'z' || k >= 'A' && k <= 'Z') {
                string++
            } else if (k >= '0' && k <= '9') {  //判断数字
                number++
            } else {
                symbol++
            }
        }
        return ('字母有' + string + '个,数字有' + number + '个,其他符号有' + symbol + '个')
    }

求s = a + aa + aaa + aaaa + aa...a的值,其中a是一个数字。例如2 + 22 + 222 + 2222 + 22222(此时共有5个数相加),几个数相加由键盘控制。

 // 分析   先输入一个数,再输入一个项
    // 首先要理解怎么输出  2  22  222  2222  这种形式的数
    function fn16() {
        let num = prompt('请输入一个数0~9')      // 输入的是字符串类型 加法计算时要注意
        let times = prompt('请输入次数')
        let sum = 0                             // 总值
        let temp = 0
        let str = ''                            // 保存住后面 2+22+222...这种形式
        for (let i = 1; i <= times; i++) {
            temp = temp * 10 + num * 1
            // 进行判断第一次没有 * 号
            i === 1 ? str += temp : str += '*' + temp
            sum += temp
        }
        return (sum + '=' + str)
    }

题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。

// 分析: 首先要理解因子的概念, a能后整除b  则b是a的一个因子 本身也是自己的因子
    // 完数: 所有真因子之和(因子出去本身)
    // 先判断一个数是不是完数,再用循环
    // 声明一个临时变量temp,找出所有因子,每找到一个temp和它相加
    // 最后判断temp和输入的数是否相等


    function fn17() {
        let arr = []                                            // 保存所有符合条件的数
        for (var i = 1; i <= 1000; i++) {
            let temp = 0                                        // 所有因子和
            let str = ''                                        // 保存因子: 1+2+3这种形式
            for (var j = 1; j < i; j++) {                       // 循环 i 以下所有的数
                if (i % j === 0) {                              // 如果 i 能除尽 则进行下一步操作,否则循环继续
                    temp += j                                   // 每次符合条件都相加,最后判断真因子相加和是否等于本身
                    j === 1 ? str += j : str += '+' + j         // 第一次没有 '+' 号
                }
            }
            if (temp === i) {                                   // 一个数循环结束,进行判断是否是完数
                arr.push(i)                                     // 是   添加到数组里
                console.log(j + '=' + str)                      // 打印 6 = 1+2+3 这种形式
            }
        }
        return arr                                              // 返回数组
    }

题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

   // 分析:   反弹  经过
    // 变量:i   m     n             m = 100/i/2     n = 100 + 2*m
    // 第一次:  50   100
    // 第二次:  25   200 = 100 + 50 + 50
    // 第三次:  12.5 250 = 100 + 50 + 50 + 25 + 25
    // 第四次:  6.25 275 = 100 + 50 + 50 + 25 + 25 + 12.5 + 12.5
    //        

    function ballBounces(num) {
        if (num === 0) return 0
        let m = 100
        let n = 0
        let i = 0
        do {
            i++
            m /= 2
            i > 1 ? n += + 4 * m : n = 100
        } while (i < num)
        let arr = []
        arr.push(m, n)
        return arr
    }
    console.log(ballBounces(10));

题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个   第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

  // 分析: 倒着来算           (n/2)-1 = 1     n = (1+1)*2         ((n/2)-1)/2-1
    // 第十天   1           
    // 第九天   4    (1+1)*2     
    // 第八天   10   (4+1)*2
    // 第七天   22   (10+1)*2           
    // 这样看的话 第九天用到了第十天的数,可以用递归   边界条件是第十天的1个桃子

    function monkey1(n = 1) {                   // 从第一天算
        if (n === 10) {
            return 1
        } else {
            return (monkey1(n + 1) + 1) * 2
        }
    }
    console.log(monkey1());


    function monkey2(n = 10) {                  // 从第十天算
        if (n === 1) {
            return 1
        } else {
            return (monkey2(n - 1) + 1) * 2
        }
    }
    console.log(monkey2());

题目:两个乒乓球队进行比赛,各出三人。甲队为a, b, c三人,乙队为x, y, z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x, z比,请编程序找出三队赛手的名单。

 // 分析: c : y   a : z   b : x

    function fn20() {
        let arr = ['x', 'y', 'z']
        for (let a = 0; a < arr.length; a++) {
            for (let b = 0; b < arr.length; b++) {
                if (a != b) {
                    for (let c = 0; c < arr.length; c++) {
                        if (c != 0 && c != 2 && a != 0 && a != c && b != c) {
                            return `a vs ${arr[a]},b vs ${arr[b]},c vs ${arr[c]}`
                        }
                    }
                }
            }
        }
    }

题目:有一分数序列:2 / 1, 3 / 2,5 / 3,8 / 5,13 / 8,21 / 13...求出这个数列的前20项之和。

 // 分析 设a = 2 ,b = 1
    // 2/1  3/2  
    // a/b  
    // a = a + b (上一个数的b)  b = a(上个数的a)   所以这两行代码谁写前写后都不行

    function fn21(n) {                          // n是前多少项 , 前20项  n就等于20
        let a = 2                               // 初始值
        let b = 1
        let sum = 0                             // 总值
        for (let i = 0; i < n; i++) {
            let temp = b                        // 临时变量保存上一次b的值
            sum += a / temp                     // 主逻辑 求和                     
            b = a                               // 上个数的a赋值给b
            a = a + temp
        }
        return sum                              // 输出前多少项的和
    }

题目:求1+2!+3!+...+20!的和

  function fn22(n) {
        let sum = 0                             // 总数
        for (let i = 1; i <= n; i++) {
            sum += fn23(i)                      // 调用阶乘
        }
        return sum
    }

题目:利用递归方法求5!。

  // 递归 5!=5*4*3*2*1    
    function fn23(n) {
        if (n === 1) {
            return 1                            // 最后一个值是1 
        } else {
            return n * fn23(n - 1)              // n * (n-1) * (n-2)* ... *1 
        }
    }

题目:输入一行字符串,以相反的顺序打印出来

function fn25(str) {
        return str.split('').reverse().join('')
        // split() 字符转数组
        // reverse() 数组翻转
        // join() 数组转字符
    }

题目: 给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

 // 分析: 先判断是否符合不多于5位的正整数,
    // 几位数: 转为字符串toString()  直接用长度length
    // 逆序,循环
    function fn26(n) {
        if (n < 0 || n > 99999) {
            return '不符合要求'
        }
        n = n.toString()        // 数字不能使用长度,字符可以
        let length = n.length
        let str = ''
        for (let i = 0; i < n.length; i++) {
            str += n[n.length - 1 - i]
        }
        return `${n}是${length}位数,逆序为${str}`
    }

    // 第二种方法
    function fn261(n) {
        if (n < 0 || n > 99999) {
            return '不符合要求'
        }
        let arr = n.toString().split('')
        let length = arr.length
        let str = arr.reverse().join('')
        return `${n}是${length}位数,逆序为${str}`
    }

 题目:判断是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

  // 首先判断一定不是回文数的情况: 不能是负数,不能0开头所以10的倍数肯定不是回文数

    function isPalindrome(x) {
        //先判断x不是回文数的情况,负数肯定不是 10的倍数肯定不是
        if (x < 0 || (x % 10 === 0 && x !== 0)) {
            return false;
        }
        let y = 0;
        while (x > y) {
            y = y * 10 + x % 10;
            x = Math.floor(x / 10);
        }
        return x === y || x === Math.floor(y / 10);
    };

    // 第二种方法 数字转字符串转化为数组,数组翻转再转化为字符串

    function fn27(x) {
        let arr = x.toString().split('')
        let temp = arr.reverse().join('')
        return x == temp
    }

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值