首页 > 编程语言 >算法

算法

时间:2022-12-14 17:45:12浏览次数:52  
标签:arr console log 算法 数组 var const

题目:在页面中接收一个用户输入的数字,并判断该数是否是质数。

 <script type="text/javascript">
            /*
            质数:只能被1和它自身整除的数,1不是质数也不是合数,质数必须是大于1的自然数。
         */

            const num = prompt('请输入一个大于1的整数:');

            //判断这个值是否合法
            if (num <= 1) {
                alert('该值不合法!');
            } else {
                //先用flag标志位,来保存当前的数的状态
                //默认当前num是质数
                let flag = true;

                //判断num是否是质数
                //获取2-num之间的数
                for (let i = 2; i < num; i++) {
                    //console.log(i);
                    //判断num是否能被i整除
                    if (num % i == 0) {
                        //一旦发现:如果num能被i整除,则说明num一定不是质数,
                        //此时:设置flag为false,然后跳出 for 循环
                        flag = false;
                        break;
                    }
                }

                //如果num是质数则输出
                if (flag) {
                    alert(num + '是质数!!!');
                } else {
                    alert('这个不是质数');
                }
            }
        </script>

题目:打印 1~100 之间的所有质数

 <script type="text/javascript">
            /*
             * 打印出1-100之间所有的质数
             */

            //打印2-100之间所有的数
            for (let i = 2; i <= 100; i++) {
                //创建一个布尔值,用来保存结果,默认i是质数
                let flag = true;

                //判断i是否是质数
                //获取到2-i之间的所有的数
                for (let j = 2; j < i; j++) {
                    //判断i是否能被j整除
                    if (i % j == 0) {
                        //如果进入判断则证明i不是质数,修改flag值为false
                        flag = false;
                    }
                }

                //如果是质数,则打印i的值
                if (flag) {
                    console.log(i);
                }
            }
        </script>

题目:99 乘法表

 <script type="text/javascript">
            /*
             * 1.打印99乘法表
             *   1*1=1
             *   1*2=2 2*2=4
             *   1*3=3 2*3=6 3*3=9
             *   1*4=4 2*4=8 3*4=12 4*4=16
             *                      ....9*9=81
             *
             * 2.打印出1-100之间所有的质数
             */

            //创建外层循环,用来控制乘法表的高度
            for (let i = 1; i <= 9; i++) {
                //创建一个内层循环来控制图形的宽度
                for (let j = 1; j <= i; j++) {
                    document.write('<span>' + j + '*' + i + '=' + i * j + '</span>');
                }

                //输出一个换行
                document.write('<br />');
            }
        </script>

题目:判断101-200之间有多少个素数,并输出所有素数(只能被1和它本身整除的自然数为素数

var count=0;
	for(var i=101;i<200;i+=2){//偶数能被2整除,肯定不是素数
	    for(var j=2;j<=i;j++){
	       if(i%j==0 && i!=j) break;//结束内层循环,外层的i肯定不是素数
	       else if(i%j==0){//或者条件写 i==j都行
	          console.log(i);//打印该素数
	          count++;
	       }   
	   }   
	}
	console.log( count);//count=21

题目:打印字符串的占位长度

提示:一个英文占一个位置,一个中文占两个位置。

思路:判断该字符是否在 0-127 之间(在的话是英文,不在是非英文)。

<script>
    //    sort();   底层用到了charCodeAt();

    var str = 'I love my country!我你爱中国!';

    //需求:求一个字符串占有几个字符位。
    //思路;如果是英文,站一个字符位,如果不是英文占两个字符位。
    //技术点:判断该字符是否在0-127之间。(在的话是英文,不在是非英文)
    alert(getZFWlength(str));
    alert(str.length);

    //定义方法:字符位
    function getZFWlength(string) {
        //定义一个计数器
        var count = 0;
        for (var i = 0; i < string.length; i++) {
            //对每一位字符串进行判断,如果Unicode编码在0-127,计数器+1;否则+2
            if (string.charCodeAt(i) < 128 && string.charCodeAt(i) >= 0) {
                count++;
            } else {
                count += 2;
            }
        }
        return count;
    }
</script>

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

/*
	对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
	1.如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
	2.如果n不等于k,k能被n整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步。
	提示:如果一个自然数能写成两个自然数的乘积,那么这两个自然数就叫作原来那个数的因数。
*/
   function divide(num){ 
        if(typeof num != 'number'){
             console.log("Please input one number");
             return;
        }
        var result=num+"="
        var k=2;
        while(k!=num){
             if(num%k==0){
                 result+=k+"*";  
                 num=num/k;
                 k=1;//因为if后面有k++,之后起始值还是k=2
             }
             k++;
        }       
        result+=k;
        console.log(result);
 }
 divide(90);
 divide(9);

题目:求任意两个正整数的最大公约数(GCD)和最小公倍数(LCM)

 function deal(num1,num2){
        num1=parseInt(num1);
        num2=parseInt(num2);
        var a=num1,b=num2,c=0;
        while(b!=0){
                c=a%b;//c为两个数的余数
                a=b;//被除数作为新的除数
                b=c;//余数作为新的被除数
        }
        var gcd=a;//此时的除数就是最大公约数
        var lcm=num1*num2/gcd;//最小公倍数
        console.log(num1+"和"+num2+"的最大公约数是"+gcd+",最小公倍数是"+lcm);
 }
 deal(25,10);

题目:求1000以内的完全数(若一个自然数,恰好与除去它本身以外的一切因数的和相等,这种数叫做完全数。)

例如,6=1+2+3
28=1+2+4+7+14
496=1+2+4+8+16+31+62+124
先计算所选取的整数a(a的取值1~1000)的因数,将各因数累加于m,若m等于a,则可确认a为完全数。

//1000以内求完全数
	var result="";
	for(var i=1;i<1000;i++){
	        var sum=0;
	        //循环求因子,并且累加
	        for(var j=1;j<=i/2;j++){
	                if(i%j==0) sum+=j;
	        }
	        //判断因子之和是否等于数字本身
	        if(sum==i) result+=i+"\t";
	}
	console.log(result);

题目:计算累加阶乘

//方法一:
	function addAndMul(num){
		var addResult = 0;
		var str = '';   //就是拼接的字符串 1!+2!+3!+4!+5!+6! =    
		for(var i=1;i<=num;i++){
			//拼接字符串
			str += i == num?i+'!=':i+'!+';
			//计算i的阶乘
			var mulResult = 1;
			for(var j=i;j>0;j--){
				mulResult *= j;
			}
			addResult += mulResult;
		}
		var result = str + addResult;
		console.log(result);
	}
	addAndMul(6);

题目:"smyhvaevaesmyh"查找字符串中所有 m 出现的位置。

var str2 = 'smyhvaevaesmyh';
for (var i = 0; i < str2.length; i++) {
    //如果指定位置的符号=== "o"
    //str2[i]
    if (str2.charAt(i) === 'm') {
        console.log(i);
    }
}

题目:判断一个字符串中出现次数最多的字符,统计这个次数

<script>
    var str2 = 'smyhvaevaesmyhvae';

    //定义一个json,然后判断json中是够有该属性,如果有该属性,那么值+1;否则创建一个该属性,并赋值为1;
    var json = {};
    for (var i = 0; i < str2.length; i++) {
        //判断:如果有该属性,那么值+1;否则创建一个该属性,并赋值为1;
        var key = str2.charAt(i);
        if (json[key] === undefined) {
            json[key] = 1;
        } else {
            json[key] += 1;
        }
    }
    console.log(json);

    console.log('----------------');
    //获取json中属性值最大的选项
    var maxKey = '';
    var maxValue = 0;
    for (var k in json) {
        //        if(maxKey == ""){
        //            maxKey = k;
        //            maxValue = json[k];
        //        }else{
        if (json[k] > maxValue) {
            maxKey = k;
            maxValue = json[k];
        }
        //        }
    }
    console.log(maxKey);
    console.log(maxValue);
</script>

题目:生成 [x, y]之间的随机整数

    /*
    * 生成两个整数之间的随机整数,并且要包含这两个整数
    */
    function getRandom(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min;
    }

    console.log(getRandom(1, 10);
    

随机点名

/*
    * 生成两个整数之间的随机整数,并且要包含这两个整数
    */
    function getRandom(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min;
    }

    const arr = ['许嵩', '邓紫棋', '毛不易', '解忧邵帅'];
    const index = getRandom(0, arr.length - 1); // 生成随机的index
    console.log(arr[index]); // 随机点名

题目:模拟日历

要求每天打开这个页面,都能定时显示当前的日期。

代码实现:

<!DOCTYPE html>
<html>
    <head lang="en">
        <meta charset="UTF-8" />
        <title></title>
        <style>
            div {
                width: 800px;
                margin: 200px auto;
                color: red;
                text-align: center;
                font: 600 30px/30px 'simsun';
            }
        </style>
    </head>
    <body>
        <div></div>

        <script>
            //模拟日历
            //需求:每天打开这个页面都能定时显示年月日和星期几
            function getCurrentDate() {
                //1.创建一个当前日期的日期对象
                const date = new Date();
                //2.然后获取其中的年、月、日和星期
                const year = date.getFullYear();
                const month = date.getMonth();
                const hao = date.getDate();
                const week = date.getDay();
                //        console.log(year+" "+month+" "+hao+" "+week);
                //3.赋值给div
                const arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
                const div = document.getElementsByTagName('div')[0];
                return '今天是:' + year + '年' + (month + 1) + '月' + hao + '日 ' + arr[week];
            }

            const div = document.getElementsByTagName('div')[0];
            div.innerText = getCurrentDate();
        </script>
    </body>
</html>

实现效果:

题目:发布会倒计时

实现思路:

  • 设置一个定时器,每间隔1毫秒就自动刷新一次div的内容。

  • 核心算法:输入的时间戳减去当前的时间戳,就是剩余时间(即倒计时),然后转换成时分秒。

代码实现:

<!DOCTYPE html>
<html>
    <head lang="en">
        <meta charset="UTF-8" />
        <title></title>
        <style>
            div {
                width: 1210px;
                margin: 200px auto;
                color: red;
                text-align: center;
                font: 600 30px/30px 'simsun';
            }
        </style>
    </head>
    <body>
        <div></div>

        <script>
            var div = document.getElementsByTagName('div')[0];

            var timer = setInterval(() => {
                countDown('2022/02/03 11:20:00');
            }, 1);

            function countDown(myTime) {
                var nowTime = new Date();
                var future = new Date(myTime);
                var timeSum = future.getTime() - nowTime.getTime(); //获取时间差:发布会时间减去此刻的毫秒值

                var day = parseInt(timeSum / 1000 / 60 / 60 / 24); // 天
                var hour = parseInt((timeSum / 1000 / 60 / 60) % 24); // 时
                var minu = parseInt((timeSum / 1000 / 60) % 60); // 分
                var sec = parseInt((timeSum / 1000) % 60); // 秒
                var millsec = parseInt(timeSum % 1000); // 毫秒

                //细节处理:所有的时间小于10的时候,在前面自动补0,毫秒值要补双0(比如如,把 8 秒改成 08 秒)
                day = day < 10 ? '0' + day : day; //day小于10吗?如果小于,就补0;如果不小于,就是day本身
                hour = hour < 10 ? '0' + hour : hour;
                minu = minu < 10 ? '0' + minu : minu;
                sec = sec < 10 ? '0' + sec : sec;
                if (millsec < 10) {
                    millsec = '00' + millsec;
                } else if (millsec < 100) {
                    millsec = '0' + millsec;
                }

                // 兜底处理
                if (timeSum < 0) {
                    div.innerHTML = '距离苹果发布会还有00天00小时00分00秒000毫秒';
                    clearInterval(timer);
                    return;
                }

                // 前端要显示的文案
                div.innerHTML = '距离苹果发布会还有' + day + '天' + hour + '小时' + minu + '分' + sec + '秒' + millsec + '毫秒';
            }
        </script>
    </body>
</html>

实现效果:

Moment.js

Moment.js 是一个轻量级的JavaScript时间库,我们可以利用它很方便地进行时间操作,提升开发效率。

使用举例:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
    </head>
    <body>
        <script src="https://cdn.bootcdn.net/ajax/libs/moment.js/2.26.0/moment.min.js"></script>
        <script>
            // 按照指定的格式,格式化当前时间
            console.log(moment().format('YYYY-MM-DD HH:mm:ss')); // 打印结果举例:2020-06-12 16:38:38
            console.log(typeof moment().format('YYYY-MM-DD HH:mm:ss')); // 打印结果:string

            // 按照指定的格式,格式化指定的时间
            console.log(moment('2020/06/12 18:01:59').format('YYYY-MM-DD HH:mm:ss')); // 打印结果:2020-06-12 18:01:59

            // 按照指定的格式,获取七天后的时间
            console.log(moment().add(7, 'days').format('YYYY-MM-DD hh:mm:ss')); // 打印结果举例:2020-06-19 04:43:56
        </script>
    </body>
</html>

题目:翻转数组

const arr = [10, 20, 30, 40, 50]; // 原始数组
const newArr = []; // 翻转后的数组
for (let i = 0; i < arr.length; i++) {
    newArr[i] = arr[arr.length - i - 1];
}
console.log(JSON.stringify(newArr));

题目:冒泡排序

思路:
1.比较相邻的元素。如果第一个比第二个大,就需要互相交换。
2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。


const arr = [20, 10, 50, 30, 40];
for (let i = 0; i < arr.length - 1; i++) {
    for (let j = 0; j < arr.length - i - 1; j++) {
        if (arr[j] > arr[j + 1]) {
            let temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}
console.log(JSON.stringify(arr));

题目:选择排序

思路: 第一次从待排序的数组元素中选出最小的一个元素,存放在序列的起始位置,然后再从剩余 的未排序元素中寻找到最小元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数 据元素的个数为零。选择排序是不稳定的排序方法。

let arr=[15,32,6,3,46,2,14,5,1];
	let selectSort=(arr)=>{
	    for(i=0;i<arr.length-1;i++){
	        let temp=i;
	        for(j=i+1;j<arr.length;j++){
	        //当前项<前一项    arr[j]表示当前项  arr[temp]前一项
	            if(arr[j]<arr[temp]){
	                let swap = arr[j];
	                arr[j]=arr[temp];
	                arr[temp]=swap;
	            }
	        }
	    }
	    return arr;
	}
	console.log(selectSort(arr));

题目:插入排序

思路:
插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素
除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在
第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
插入排序的基本思想是:每步将一个待排序的记录,按其值的大小插入前面已经排序的数据中适
当位置上,直到全部插入完为止。

	let arr=[12,5,3,7,8,1,6,4];
	let insertSort=(arr)=>{
	    for(i=0;i<arr.length-1;i++){  //n-1个数已经排好序
	        for(j=i+1;j>0;j--){	//n个数插入到前面的有序数列中
	            if(arr[j]>arr[j-1]){ //后一项小于前一项,需要交换位置
	                let temp=arr[j];
	                arr[j]=arr[j-1];
	                arr[j-1]=temp;
	            }
	        }
	    }
	    return arr
	}
	console.log(insertSort(arr));

题目:数组最大差值

Array.prototype.outputMaxPrice  = function outputMaxPrice (array) {
    /* 求一组数中最大值和最小值直接使用内置对象函数Math中的min()和max()方法即可。
       注意,apply方法的第二个参数必须是一个数组,第二个参数用来替换原函数的参数
       apply用于更改this指向,但这道题我们是不需要的,我们只需要将math.max及math.min应用到数组上即可 */
      const item1 = Math.max.apply( null, array );
      const item2 = Math.min.apply( null, array );
        // const item1 = Math.max(10,5,11,7,8,9);
        // const item2 = Math.min(10,5,11,7,8,9);
    
      return item1 - item2;
    }
    
    const array = new Array;//创建实例
    var arr = [10,5,11,7,8,9]
    
    var result = array.outputMaxPrice (arr)   //  6
    console.log(result);

题目:字符串去重


<script>
var str="aaabccdeeeeeeff";
var str1=str.split("");
var a=[];
for(i=0;i<str1.length;i++) {
    a.push(str1[i]);
    var count = 1;
    for (k = i; k < str1.length - 1; k++) {
        if (str1[i] == str1[k + 1]) {
            count++;
            str1.splice(k + 1, 1);
            k--;
        }
    }
}
    console.log(a);

题目:将数组中的数字按照从小到大排序

let arr = [5, 2, 11, 3, 4, 1];

// 自定义排序规则:升序排列
let result = arr.sort((a, b) => a - b);

console.log('arr =' + JSON.stringify(arr));
console.log('result =' + JSON.stringify(result));

题目:将数组从小到大排序

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
    </head>
    <body>
        <script>
            let dataList = [
                {
                    title: '品牌鞋子,高品质低价入手',
                    publishTime: 200,
                },
                {
                    title: '不是很贵,但是很暖',
                    publishTime: 100,
                },
                {
                    title: '无法拒绝的美食,跟我一起吃',
                    publishTime: 300,
                },
            ];

            console.log('排序前的数组:' + JSON.stringify(dataList));

            // 将dataList 数组,按照 publishTime 字段,从小到大排序。(会改变原数组)
            dataList.sort((a, b) => parseInt(a.publishTime) - parseInt(b.publishTime));

            console.log('排序后的数组:' + JSON.stringify(dataList));
        </script>
    </body>
</html>

打印结果:

排序前的数组:[
    {"title":"品牌鞋子,高品质低价入手","publishTime":200},
    {"title":"不是很贵,但是很暖","publishTime":100},
    {"title":"无法拒绝的美食,跟我一起吃","publishTime":300}
]
排序后的数组:[
    {"title":"不是很贵,但是很暖","publishTime":100},
    {"title":"品牌鞋子,高品质低价入手","publishTime":200},
    {"title":"无法拒绝的美食,跟我一起吃","publishTime":300}
]

map 方法:

题目:有一个已知的数组 arr1,我要求让 arr1 中的每个元素的值都加 10,这里就可以用到 map 方法。

const arr1 = [1, 3, 6, 2, 5, 6];
const arr2 = arr1.map(item => {
  return item + 10; //让arr1中的每个元素加10
});
console.log(arr2); // 数组 arr2 的值:[11, 13, 16, 12, 15, 16]

题目:将 A 数组中某个属性的值,存储到 B 数组中

const arr1 = [
    { name: '千古壹号', age: '28' },
    { name: '许嵩', age: '32' },
];

// 将数组 arr1 中的 name 属性,存储到 数组 arr2 中
const arr2 = arr1.map(item => item.name);

// 将数组 arr1 中的 name、age这两个属性,改一下“键”的名字,存储到 arr3中
const arr3 = arr1.map(item => ({
    myName: item.name,
    myAge: item.age,
})); // 将数组 arr1 中的 name 属性,存储到 数组 arr2 中

console.log('arr1:' + JSON.stringify(arr1));
console.log('arr2:' + JSON.stringify(arr2));
console.log('arr3:' + JSON.stringify(arr3));

打印结果:

arr1:[{"name":"千古壹号","age":"28"},{"name":"许嵩","age":"32"}]

arr2:["千古壹号","许嵩"]

arr3:[{"myName":"千古壹号","myAge":"28"},{"myName":"许嵩","myAge":"32"}]

map 的应用场景,主要就是以上两种。

filter()方法

题目:找出数组 arr1 中大于 4 的元素,返回一个新的数组

let arr1 = [1, 3, 6, 2, 5, 6];

let arr2 = arr1.filter(item => {
    if (item > 4) {
        return true; // 将arr1中大于4的元素返回,组成新的数组
    }
    return false;
});

console.log(JSON.stringify(arr1)); // 打印结果:[1,3,6,2,5,6]
console.log(JSON.stringify(arr2)); // 打印结果:[6,5,6]

题目:获取对象数组 arr1 中指定类型的对象,放到数组 arr2 中

const arr1 = [
    { name: '许嵩', type: '一线' },
    { name: '周杰伦', type: '退居二线' },
    { name: '邓紫棋', type: '一线' },
];

const arr2 = arr1.filter((item) => item.type == '一线'); // 筛选出一线歌手

console.log(JSON.stringify(arr2));

题目:splice()练习:数组去重

//创建一个数组
const arr = [1, 2, 3, 2, 2, 1, 3, 4, 2, 5];

//去除数组中重复的数字
//获取数组中的每一个元素
for (let i = 0; i < arr.length; i++) {
    /*获取当前元素后的所有元素*/
    for (let j = i + 1; j < arr.length; j++) {
        //console.log("---->"+arr[j]);
        //判断两个元素的值是否相等
        if (arr[i] == arr[j]) {
            //如果相等则证明出现了重复的元素,则删除j对应的元素
            arr.splice(j, 1);
            //当删除了当前j所在的元素以后,后边的元素会自动补位
            //此时将不会再比较这个元素,我们需要再比较一次j所在位置的元素
            //使j自减
            j--;
        }
    }
}

console.log(arr);

题目:join() 练习

问题:将一个字符串数组输出为|分割的形式,比如“千古|宿敌|素颜”。使用两种方式实现。

方式 1:(不推荐)

var arr = ['千古', '宿敌', '素颜'];
var str = arr[0];
var separator = '|';
for (var i = 1; i < arr.length; i++) {
    str += separator + arr[i]; //从第1个数组元素开始,每个元素前面加上符号"|"
}

console.log(str);

输出结果:

不推荐这种方式,因为:由于字符串的不变性,str 拼接过多的话,容易导致内存溢出(很多个 str 都堆放在栈里)。

方式 2:(推荐。通过 array 数组自带的 api 来实现)

var arr = ['千古', '宿敌', '素颜'];

console.log(arr.join('|'));

结果:

题目:reverse() 练习

题目:将一个字符串数组的元素的顺序进行反转,使用两种种方式实现。提示:第 i 个和第 length-i-1 个进行交换。

方式 1:

function reverse(array) {
    var newArr = [];
    for (var i = array.length - 1; i >= 0; i--) {
        newArr[newArr.length] = array[i];
    }
    return newArr;
}

方式 2:(算法里比较常见的方式)

function reverse(array) {
    for (var i = 0; i < array.length / 2; i++) {
        var temp = array[i];
        array[i] = array[array.length - 1 - i];
        array[array.length - 1 - i] = temp;
    }
    return array;
}

题目:编写一个方法去掉一个数组中的重复元素

//    编写一个方法 去掉一个数组的重复元素
var arr = [1, 2, 3, 4, 5, 2, 3, 4];
console.log(arr);
var aaa = fn(arr);
console.log(aaa);
//思路:创建一个新数组,循环遍历,只要新数组中有老数组的值,就不用再添加了。
function fn(array) {
    var newArr = [];
    for (var i = 0; i < array.length; i++) {
        //开闭原则
        var bool = true;
        //每次都要判断新数组中是否有旧数组中的值。
        for (var j = 0; j < newArr.length; j++) {
            if (array[i] === newArr[j]) {
                bool = false;
            }
        }
        if (bool) {
            newArr[newArr.length] = array[i];
        }
    }
    return newArr;
}

题目:喇叭花数是一个三位数,其每一位数字的阶乘之和恰好等于它本身,即abc=a! + b! + c!,其中abc表示一个三位数。请找出所有的喇叭花数。

// 递归函数:计算一个数的阶乘
function factorial(n) {
  // 递归出口:如果计算1的阶乘,就不用递归了
  if (n == 1) return 1;

  // 开始递归:如果当前这个 n 不是1,就返回 n * (n-1)!
  return n * factorial(n - 1);
}

// 穷举法,从100到999遍历,寻找喇叭花数
for (let i = 100; i <= 999; i++) {
  // 将数字i转为字符串
  const i_str = i.toString();
  // abc分别表示百位、十位、个位
  const a = Number(i_str[0]);
  const b = Number(i_str[1]);
  const c = Number(i_str[2]);

  // 根据喇叭花数的条件进行判断
  if (factorial(a) + factorial(b) + factorial(c) == i) {
    console.log(i);
  }
}

题目:斐波那契数列

斐波那契数列是这样一个数列:1、1、2、3、5、8、13、21、34......最早是由意大利数学家斐波那契开始研究的。它的规律是:下标为0和1的项,值为1;从下标为2的项开始,每一项等于前面两项之和。

提问:请找出斐波那契数列的前10项。

// 递归函数:返回斐波那契数列中下标为n的那一项的值
function fib(n) {
  // 下标为0和1的项,值为1
  if (n == 0 || n == 1) return 1;
  // 从下标为2的项开始,每一项等于前面两项之和
  return fib(n - 1) + fib(n - 2);
}

// 循环语句:打印斐波那契数列的前10项
for (let i = 0; i < 15; i++) {
  console.log(fib(i));
}

题目:1-100 之间 逢7过 数字中包含7 或者 7的倍数都要跳过


for(var i = 1;i <= 100;i++){
// 不属于 7的倍数 & i/10的余数为7的 展示数据 将 i/10 转换为int,余数都为整数,并且全不等来判断
    if(i % 7 != 0 && i % 10 != 7 && parseInt (i / 10) !== 7){
        console.log(i);
        continue;
    }

题目:匀速动画的封装:每间隔30ms,移动盒子10px

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .box1 {
            margin: 0;
            padding: 5px;
            height: 300px;
            background-color: #ddd;
            position: relative;
        }

        button {
            margin: 5px;
        }

        .box2 {
            width: 100px;
            height: 100px;
            background-color: red;
            position: absolute;
            left: 195px;
            top: 40px;
        }

        .box3 {
            width: 100px;
            height: 100px;
            background-color: yellow;
            position: absolute;
            left: 0;
            top: 150px;
        }
    </style>
</head>
<body>
<div class="box1">
    <button>运动到 left = 200px</button>
    <button>运动到 left = 400px</button>
    <div class="box2"></div>
    <div class="box3"></div>
</div>
<script>
    var btnArr = document.getElementsByTagName("button");
    var box2 = document.getElementsByClassName("box2")[0];
    var box3 = document.getElementsByClassName("box3")[0];

    //绑定事件
    btnArr[0].onclick = function () {
        //如果有一天我们要传递另外一个盒子,那么我们的方法就不好用了
        //所以我们要增加第二个参数,被移动的盒子本身。
        animate(box2, 200);
        animate(box3, 200);
    }

    btnArr[1].onclick = function () {
        animate(box2, 400);
        animate(box3, 400);
    }
    
       //【重要】方法的封装:每间隔30ms,将盒子向右移动10px
    function animate(ele, target) {
        //要用定时器,先清除定时器
        //一个盒子只能有一个定时器,这样的话,不会和其他盒子出现定时器冲突
        //我们可以把定时器本身,当成为盒子的一个属性
        clearInterval(ele.timer);
        //我们要求盒子既能向前又能向后,那么我们的步长就得有正有负
        //目标值如果大于当前值取正,目标值如果小于当前值取负
        var speed = target > ele.offsetLeft ? 10 : -10;  //speed指的是步长
        ele.timer = setInterval(function () {
            //在执行之前就获取当前值和目标值之差
            var val = target - ele.offsetLeft;

            //移动的过程中,如果目标值和当前值之差如果小于步长,那么就不能在前进了
            //因为步长有正有负,所有转换成绝对值来比较
            if (Math.abs(val) < Math.abs(speed)) {  //如果val小于步长,则直接到达目的地;否则,每次移动一个步长
                ele.styl	e.left = target + "px";
                clearInterval(ele.timer);
            } else {
                ele.style.left = ele.offsetLeft + speed + "px";
            }
        }, 30)
    }
</script>
</body>
</html>

题目:根据浏览器的可视宽度,给定不同的背景的色

函数封装:获取浏览器的宽高(可视区域)

//函数封装:获取屏幕可视区域的宽高
function client() {
    if (window.innerHeight !== undefined) {
        //ie9及其以上的版本的写法
        return {
            "width": window.innerWidth,
            "height": window.innerHeight
        }
    } else if (document.compatMode === "CSS1Compat") {
        //标准模式的写法(有DTD时)
        return {
            "width": document.documentElement.clientWidth,
            "height": document.documentElement.clientHeight
        }
    } else {
        //没有DTD时的写法
        return {
            "width": document.body.clientWidth,
            "height": document.body.clientHeight
        }
    }
}

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
//上面的封装好的方法
<script src="tools.js"></script>
<script>
    //需求:浏览器每次更改大小,判断是否符合某一标准然后给背景上色。
    //  // >960红色,大于640小于960蓝色,小于640绿色。

    window.onresize = fn;  //页面大小发生变化时,执行该函数。
    //页面加载的时候直接执行一次函数,确定浏览器可视区域的宽,给背景上色
    fn();

    //封装成函数,然后指定的时候去调用和绑定函数名
    function fn() {
        if (client().width > 960) {
            document.body.style.backgroundColor = "red";
        } else if (client().width > 640) {
            document.body.style.backgroundColor = "blue";
        } else {
            document.body.style.backgroundColor = "green";
        }
    }
</script>
</body>
</html>

标签:arr,console,log,算法,数组,var,const
From: https://www.cnblogs.com/qianfanqf/p/16982787.html

相关文章