10个js算法题目(详细注释+源码)

1、冒泡排序调优(从小到大排序)
2、输出九九乘法表
3、输出水仙花数
4、1–10的阶乘和
5、输出1900年至2100年中的所有闰年
6、输出10–100之间的所有素数
7、1,2,3,4四个数字,能组合成多少种互不相同且没有重复的三位数
8、取出四位数中的各个位上的数字
9、猴子吃桃问题
10、用星号输出菱形

Google Chrome Console运行结果

JavaScript的算法题 js常见算法题_JavaScript的算法题

源代码如下:

<!-- 
    @Author: Chauncey Yuan 
    @Date: 2019-07-19 19:43:13 
    @Last Modified by: Chauncey Yuan 
    @Last Modified time: 2019-07-20 14:20:26
-->
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>js算法题目练习</title>
</head>

<body>
    <!-- 1、冒泡排序调优(从小到大排序) -->
    <script type="text/javascript">
        // 内容提示
        console.log("1、冒泡排序调优(从小到大排序)");
        // 定义任意长度的数组
        var a = [6, 9, 60, 10, 13, 15, 45, 78, 89, 17, 24, 34, 3];
        // 定义结果集,提示排序前的信息
        var result1 = "共有" + a.length + "个数参与排序\n";
        // 排序前的数据排列
        result1 += "排序前:\t";
        // 循环将排序前的数组放入结果集
        for (var x = 0; x < a.length; x++) {
            result1 += a[x] + "\t";
        }
        // 结果集换行
        result1 += "\n";
        // 只要排序算法如下:
        // 外层循环主要用来取数组中的数据
        for (var i = 0; i < a.length - 1; i++) {
            // 定义标志置0
            var flag = 0;
            // 内层循环用来取外层循环中取出的数中的后面的数
            for (var j = 0; j < a.length - 1 - i; j++) {
                // 如果后一个数小于前一个数,则互换位置
                if (a[j + 1] < a[j]) {
                    // 交换位置
                    b = a[j + 1];
                    a[j + 1] = a[j];
                    a[j] = b;
                    // 标志置1,表示此处有排序操作
                    flag = 1;
                }
            }
            // 如果标志为0,即未进行排序操作
            if (flag == 0) {
                // 跳出循环
                break;
                // 若没有这一个步骤,排序会在已经排好顺序之后继续排序,
                // 但是无实际操作,直到外层循环将每个数都取出排序才会停止,
                // 因此使用这样一个简单的调优操作
            }
            // 讲每一次排序的结果存入结果集,直到未进行排序时结束
            result1 += "第" + (i + 1) + "次:\t";
            for (var c = 0; c < a.length; c++) {
                result1 += a[c] + "\t";
            }
            // 每次排序结果存入结果集后,增加换行,进行区别
            result1 += "\n";
        }
        // 讲排序后的最终结果加入结果集中
        result1 += "排序后:\t";
        for (var c = 0; c < a.length; c++) {
            result1 += a[c] + "\t";
        }
        // 输出最终的整个排序结果
        console.log(result1);
        // 输出换行,区分下一块内容
        console.log("\n");
    </script>

    <!-- 2、输出九九乘法表 -->
    <script type="text/javascript">
        // 内容提示
        console.log("2、输出九九乘法表:");
        // 定义一个string类型的变量,用于存放乘法表结果
        var output2 = "";
        // 第一层循环,第一个因数,1~9
        for (var i = 1; i <= 9; i++) {
            // 第二层循环,第二个因数,1~i
            for (var j = 1; j <= i; j++) {
                // j*i = j * i,制表符用来对齐
                output2 += j + "*" + i + "=" + i * j + "\t";
            }
            // 每一行输出后,增加换行
            output2 += "\n";
        }
        // 输出乘法表结果
        console.log(output2);
        // 输出换行,区分下一块内容
        console.log("\n");
    </script>

    <!-- 3、输出水仙花数 -->
    <script type="text/javascript">
        // 内容提示
        console.log("3、输出水仙花数");
        // 定义三个变量,用于取出三位数的百位,十位,千位
        var a = 0,
            b = 0,
            c = 0;
        // 定义一个string类型的变量,用于存放计算结果
        var output3 = "水仙花数有:";
        // 从101到999循环,水仙花数是一个三位数
        for (var num = 101; num <= 999; num++) {
            // 取出百位
            a = parseInt(num / 100);
            // 取出十位
            b = parseInt(num % 100 / 10);
            // 取出个位
            c = parseInt(num % 100 % 10);
            // 判断是否满足水仙花数的条件
            if (a * a * a + b * b * b + c * c * c == num) {
                // 将满足条件的数存入结果
                output3 += num + " ";
            }
        }
        // 输出结果
        console.log(output3);
        // 输出换行,区分下一块内容
        console.log("\n");
    </script>

    <!-- 4、1--10的阶乘和 -->
    <script type="text/javascript">
        // 内容提示
        console.log("4、1--10的阶乘和");
        // 定义结果
        var result = 0;
        // 定义阶乘结果
        var factorial = 1;
        // 第一层循环表示从1到10循环
        for (var i = 1; i <= 10; i++) {
            // 第二层循环表示求1到10的每一个数的阶乘的过程
            for (var j = 1; j <= i; j++) {
                // 求阶层的方法
                factorial = factorial * j;
            }
            // 将每次循环的阶乘结果加到定义的结果中
            result = result + factorial;
            // 阶乘结果每次循环之后回到初始值
            factorial = 1;
        }
        // 输出最终的阶乘和的结果
        console.log("1--10的阶乘和为:" + result);
        // 输出换行,区分下一块内容
        console.log("\n");
    </script>

    <!-- 5、输出1900年至2100年中的所有闰年 -->
    <script type="text/javascript">
        // 内容提示
        console.log("5、输出1900年至2100年中的所有闰年");
        // 定义结果集,并给出提示,用于储存结果
        var result5 = "1900年至2100年中的所有闰年有:\n";
        // 设置一个标志,用来判断每行是否有5个年份
        var flag = 0;
        // 1900-2100循环,依次计算
        for (var year = 1900; year <= 2100; year++) {
            // 判断是都满足闰年的条件
            if ((parseInt(year % 4) == 0) && (((parseInt(year % 100) != 0)) || (parseInt(year % 400) == 0))) {
                // 满足条件的年份放入结果集中并加入空格隔开
                result5 += year + "\t";
                // 每往结果集中放一个年份标志加1
                flag++;
            }
            // 如果标志等于5,表示每一行有了5个年份,需要换行操作
            if (flag == 5) {
                // 结果集中加入换行
                result5 += "\n";
                // 重置标志
                flag = 0;
            }
        }
        // 输出最终结果
        console.log(result5);
        // 输出换行,区分下一块内容
        console.log("\n");
    </script>

    <!-- 6、输出10--100之间的所有素数 -->
    <script type="text/javascript">
        // 内容提示
        console.log("6、输出10--500之间的所有素数");
        // 定义结果集,用于储存后面计算得出的素数并提示
        var primeNumbers = "10--500之间的所有素数有:\n";
        // 定义一个是否到了5的标志,用于后面控制是否一行有5个数字
        var areFive = 0;
        // 10到500循环,一次利用下面的算法进行判断
        for (var num = 10; num <= 500; num++) {
            // 定义标志,用来判断能不能被除1和自己本身的其他数整除
            var flag = true;
            // 用第一次循环中的每一个数,来除以除1和他本身的之间的所有整数
            for (var i = 2; i <= num - 1; i++) {
                // 判断这个数除以除1和他本身的之间的所有整数是否有能被整除的情况
                if (num % i == 0) {
                    // 如果能被除1和他本身的之间的所有整数整除,标志设置为false
                    flag = false;
                    // 跳出本次循环,当前数字不是素数
                    break;
                }
            }
            // 如果标志flag在上一步没有被设置成false,表示该数为素数
            if (flag == true) {
                // 将该次循环中的数字放入结果集中,并增加制表符来对齐
                primeNumbers += num + "\t\t";
                // 每写入一个素数,判断是否有5个的标志增加1
                areFive++;
            }
            // 如果判断是否有5个的标志到了5
            if (areFive == 5) {
                // 给结果集增加一个换行
                primeNumbers += "\n";
                // 重置标志
                areFive = 0;
            }
        }
        // 输出最终的结果
        console.log(primeNumbers);
        // 输出换行,区分下一块内容
        console.log("\n");
    </script>

    <!-- 7、1,2,3,4四个数字,能组合成多少种互不相同且没有重复的三位数 -->
    <script type="text/javascript">
        // 内容提示
        console.log("7、1,2,3,4四个数字,能组合成多少种互不相同且没有重复的三位数");
        // 定义记数标志
        var count = 0;
        // 定义结果集,存放结果
        var result7 = "能组合成的互不相同且没有重复的三位数有:\n";
        // 三次循环表示三位数,每次循环,都是1,2,3,4
        for (var i = 1; i <= 4; i++) {
            for (var j = 1; j <= 4; j++) {
                for (var k = 1; k <= 4; k++) {
                    // 如果三个数字都不相等
                    if (i != j && j != k && k != i) {
                        // 组合成一个三位数
                        var sum = 100 * i + 10 * j + k;
                        // 存储到结果集中
                        result7 += sum + "  ";
                        // 记数标志加1
                        count++;
                    }
                }
            }
        }
        // 换行后在结果中加入种数
        result7 += "\n一共有" + count + "种";
        // 输出结果
        console.log(result7);
        // 输出换行,区分下一块内容
        console.log("\n");
    </script>

    <!-- 8、取出四位数中的各个位上的数字 -->
    <script type="text/javascript">
        // 内容提示
        console.log("8、取出四位数中的各个位上的数字:");
        //定义一个四位数 
        var num = 4578;
        // 输出原四位数
        console.log("原四位数是:" + num);
        // 取出千位
        var a = num / 1000;
        // 取出百位
        var b = num % 1000 / 100;
        // 取出十位
        var c = num % 1000 % 100 / 10;
        // 取出个位
        var d = num % 1000 % 100 % 10;
        //取出个位的另一种
        //var d = num % 10;
        console.log("千位是:" + parseInt(a) + ",百位是:" + parseInt(b) + ",十位是:" + parseInt(c) + ",个位是:" + parseInt(d));
        // 输出换行,区分下一块内容
        console.log("\n");
    </script>

    <!-- 9、猴子吃桃问题 -->
    <script type="text/javascript">
        // 内容提示
        console.log("9、猴子吃桃问题:");
        console.log("猴子吃桃子问题:猴子第一天摘下N个桃子,当时就吃了一半,还不过瘾,就又吃了一个。");
        console.log("\t\t\t第二天又将剩下的桃子吃掉一半,又多吃了一个。以后每天都吃前一天剩下的一半零一个。");
        console.log("\t\t\t到第10天在想吃的时候就剩一个桃子了。求第一天共摘下来多少个桃子?");
        // 定义总数
        var sum = 1;
        // 按照题目从第10天往前计算
        for (var i = 1; i < 10; i++) {
            sum = (sum + 1) * 2;
        }
        // 输出结果
        console.log("计算答案:第一天共摘下来的桃子个数是" + sum + "个");
        // 输出换行,区分下一块内容
        console.log("\n");
    </script>

    <!-- 10、用星号输出菱形 -->
    <script type="text/javascript">
        // 内容提示
        console.log("10、用星号输出菱形");
        // 定义结果集,用来存放星号和空格
        var result10 = "";
        // 定义菱形宽度
        var width = 10;
        // 菱形上半部分,循环递增
        for (var i = 1; i <= width; i++) {
            // 菱形上半部分,空格递减
            for (var a = width - i; a >= 1; a--) {
                result10 += " ";
            }
            // 菱形上半部分,星号递增
            for (var j = 1; j <= i * 2 - 1; j++) {
                result10 += "*";
            }
            // 每一行结束后换行
            result10 += "\n";
        }
        // 菱形下半部分,循环递减
        for (var i = width - 1; i >= 1; i--) {
            // 菱形下半部分,空格递增(递减的递减)
            for (var a = width - i; a >= 1; a--) {
                result10 += " ";
            }
            // 菱形下半部分,星号递减(递减的递增)
            for (var j = 1; j <= i * 2 - 1; j++) {
                result10 += "*";
            }
            result10 += "\n";
        }
        console.log(result10);
        // 输出换行,区分下一块内容
        console.log("\n");
    </script>
</body>

</html>