说点js平易算数题

js算法题:

基础题

求三个数的大小,并按从小到大输出

    var min = Number(prompt('请输入三个值的第一个值:'))
    var center = Number(prompt('请输入三个值的第二个值:'))
    var max = Number(prompt('请输入三个值的第三个值:'))

    function sort() {
      // 定义三个变量来接收相应的值
      // 假设第一个值为最小值
      var min = arguments[0];
      var center;
      // 假设第一个值为最大值
      var max = arguments[0];

      // 这个循环是求得最小值 和 最大值
      for (var i = 0; i < arguments.length; i++) {
        if (min > arguments[i]) {
          min = arguments[i]
        }
        if (max < arguments[i]) {
          max = arguments[i]
        }
      }
      // 只要不是最小是也不是最大值 那么就是中间的值
      for (var j = 0; j < arguments.length; j++) {
        if (arguments[j] !== min && arguments[j] !== max) {
          center = arguments[j]
        }
      }

      // 把结果返回出去
      console.log(min, center, max); //打印输出台
      alert(min + "," + center + "," + max); //弹出框也可以输出
    }
    sort(min, center, max);


判断是否为质数

  /*
        - 编写一个函数,求一个数字是否是质数
        - 一个数字除了 1 和本以外,不能被别的数字整除,那么这个数字就是质数
        7 是一个质数 因为7 只能被 自己 和 1整除
        7 %  6 !== 0
        7 %  5 !== 0
        7 %  4 !== 0
        7 %  3 !== 0
        7 %  2 !== 0

        12 不是质数 2--11

        11 求2-10之间有没有一个数能够被11整除,那么如果有就说明不是质数,没有就说明是质数
        n  求2--n-1之间有没有一个数能够被n整除
    */
    function zhishu(n) {
      // 定义一个标识去判断 是否是质数
      var flag = true;
      for (var i = 2; i < n; i++) {
        // 判断能够被 n整除的数,有被整除的数就执行if条件
        if (n % i === 0) {
          //  执行了if条件的代码就说明不是一个质数,跳出循环
          // 执行了这里就说明不是质数
          flag = false;
          break
        }
      }
      if (flag) {
        console.log(n + '是一个质数');
      } else {
        console.log(n + '不是一个质数');
      }
    }

    //这个循环可以 求100——200之间的质数
    for (var i = 100; i <= 200; i++) {
      zhishu(i);
    }

编写一个函数,计算任意两个数字之间所能组成的奇数个数,数字必须是个位数,
但是如11,33的数值需要去掉;
比如: 计算0-3之间能组成的奇数个是01、03、11、13、21、23、31、33
00 01 02 03
11 12 13

 function fun(a, b) {
      // 当你要拼接字符串的时候,那么这个位置必须给 ''
      var result = '';

      // q求最小值和最大值
      var min = a > b ? b : a;
      var max = a > b ? a : b
      for (var i = min; i <= max; i++) {
        for (var j = min; j <= max; j++) {
          // var res = '' + i + j; 用整数 去计算 到底是不是偶数
          // if (res % 2 !== 0 || i !== j) {

          // }

          // 用数的个位数去计算到底是不是偶数
          if (j % 2 !== 0 && i !== j) {
            // console.log('' + i + j)
            // 赋值运算的优先级最低 先把右边的表达式计算完成 然后进行 赋值运算
            result += '' + i + j + ','
          }
        }
      }
      return result;
    }
    console.log(fun(3, 6))

求叠数之和

  • 如输入的是 n=3, a=2;则输出 2 + 22 + 222 的值。
  • 如输入的是 n=4, a=3;输出 3 + 33 + 333 + 3333的值
    • n = 3,相加三次,每次相加比前一次相加的数,多一位
    • 每次多的这个位数的值为a, 如果a为2则 2 * 10 + 2 =22, 22 * 10+2 = 222

    var n = 4, a = 3;
    // 求2+22+222的和,n为多少,就要加多少个数
    var sum = 0;//用来存放计算的和

    for (var i = 1; i <= n; i++) {
        sum += a;
        a = a * 10 + a % 10; //a %10 = 2 得到每个数字的个位数
    }
    console.log(sum);
    
    /*
        a = a * 10 + 2; a + 2  2不能写死,当a变量的值不是2的时候,那么加的不是2
        i = 1   sum = sum + a = 0 +2 = 2  a = a*10 +2 = 22
        i = 2   sum = sum + a = 2 + 22    a = a*10 +2 =  222
        i = 3   sum =sum + a = 2 +22 +222  a = a*10 +2 =2220 + 2 = 2222

        a = a * 10 + a; 直接+a有问题,因为a一直在变化
        i = 1   sum = sum + a = 0 +2 = 2  a = a*10 + a = 22
        i = 2   sum = sum + a = 2 + 22    a = a*10 + a=  220 + 22 = 242
        i = 3   sum =sum + a = 2 +22 +222 a = a*10 + a =2220 + 2 = 2222
    */
  

阶乘题:求1 + 2! + 3! + 4!…+20!的值

        /*
          求1 + 2! + 3! + 4!....+20!的值
        */
        // var res1 = 1;
        // var res2 = 1;

        // for (var i = 1; i <= 1; i++) {
        //     res1 *= i; // 1
        //     //1
        // }
        // sum += res1;

        // for (var i = 1; i <= 2; i++) {
        //     res2 *= i; // res2 = 1 
        //     // 这句代码写在for循环里面,每执行一次循环就会 加一次
        //     // sum += res2
        // }
        // sum += res2

        var sum = 0; //定义一个变量来接收求和的值

        for (var j = 1; j <= 20; j++) {
            // 一定要重置 res的值为1,确保每一个阶乘的值都是正确
            var res = 1;
            // 这个循环是求得每一个数的阶乘
            for (var i = 1; i <= j; i++) {
                res *= i;
            }
            // 内层循环循环完之后,那阶乘的值相加
            sum += res;
        }
        console.log(sum);

回文数

  • 要求:打印10000~99999区间的回文数字,形如12321 23432 34543等
    • 提示: 回文数需同时满足下面的条件
      [1] 第一位和倒数第一位相等
      [2] 第二位和倒数第二位相等
      [2] 第二位等于第一位数加一
      [3] 第三位等于第二位数加一

      for(var i = 10000;i <=99999;i++){
        var g = i % 10;
        var s = parseInt(i /10 % 10);
        var b = parseInt(i /100 % 10);
        var q = parseInt(i /1000 % 10);
        var w = parseInt(i / 10000);
        if(g === w && s === q && s === g+1 && b === s+1){
           document.write(i)
        }
    }
    

输入两个数,求两个数的最小公倍数

  • 先取出两个数中最大的数
  • 最大的数不断递增,提出能整除两个数的那个数,然后退出循环

  <input type="text" value="num1">
  <input type="text" value="num2">
  <button onclick="lcm()"> </button>
  
  function lcm(){
      //获取两个数的值
      var num1 = num1.value;
  	  var num2 = num2.value;
      
      //判断两个数中较小的值
      var max = num1 > num2 ? num1 : num2;
      for(var i = max;i >= 1;i++){
          if(i % num1 === 0 && i % num2 === 0){
              console.log(i + '就是' + num1 +'和' + num2 +'的最小公倍数')
          }
      }
  }
  

输入两个数求两个数的最大公约数

  • 先取出两个数中最小的数
  • 最小的数不断递减,取出能同时被两个数整除的数,并退出循环

  <input type="text" value="num1">
  <input type="text" value="num2">
  <button onclick="gcd()"> </button>
  
  function gcd(){
      //获取两个数的值
      var num1 = num1.value;
  	  var num2 = num2.value;
      
      //判断两个数中较小的值
      var min = num1 > num2 ? num2 : num1;
      
      //用最小的值 递减找出能被两个数整除的值
      for(var i = min; i >= 1;i--){
          if(num1 % i === 0 && num2 % i === 0){
              console.log(i + '就是' + num1 +'和'+ num2 + '的最大公约数')break
          }
      }
  }

打印三角形


  *
  **
  ***
  ****
  *****
  ******
  *******
  ********
  *********
  
  for(var i = 0; i <=9 ;i++){
     for(var j = 1;j <= i;j++){
          document.write('*');
      }
      document.write('<br />')
  }
  

求出1-1/2 + 1/3 - 1/4 + 1/5… 1/100的和


  var sum = 0;
  for(var i = 1;i <= 100; i++){
      if(i % 2 === 0){
          sum -= 1/i;
      }else {
         sum += 1/i 
      }
  }
  console.log(sum)
  

斐波那契数列

1 1 2 3 5 8 13 21…
推导公式:fib(m) = fib(m-1) + fib(m-2)


 // 求 6 的斐波那契数列值 ,用函数返回
    function fib(n) {
      // 1 和 2 的斐波那契数列的值都为 1
      if (n === 1 || n === 2) {
        return 1
      }
      // 变量更新
      // var n1 = n - 1;
      // var n2 = n - 2;
      return fib(n - 1) + fib(n - 2)
    }
    console.log(fib(9));

数组题

求数组的偶数和五个一组并输出平均值,放在另一个数组中并输出。试编程

<script>
    // 定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;
    // 然后按顺序每五个数求出一个平均值,放在另一个数组中并输出。试编程。

    // [1]定义一个长度为30 的数组
    var arr = new Array(30);

    // [2]循环给数组添加数据
    for (var i = 0; i < arr.length; i++) {
      // 设置数组的每一个数据
      arr[i] = (i + 1) * 2;
    }

    // [3] 创建一个新数组来存放平均值
    var arr1 = [];
    var sum = 0; //用来接收每5个数的和
    var index = 0; //定义一个 新数字的索引,默认从0开始

    // [4]循环 原始数组 计算平均值
    for (var j = 0; j < arr.length; j++) {
      sum += arr[j]
      // 第一次得到5个数的时候 j = 4 % 5 = 4
      // 第二次得到5个数的时候 j = 9 % 5 = 4
      // 第三次得到5个数的时候 j = 14 % 5 = 4 
      // (j + 1) % 5 === 0
      if (j % 5 === 4) {
        // 进入这个条件说明已经加够 5个数,需要求平均值 放入 新数组
        arr1[index] = sum / 5;
        // 已经得到5个数的平均值了,求下一次5个数之和之前一定情况sum
        sum = 0;
        // 索引+1
        index++
      }
    }

  </script>

求:通过循环按行顺序得到一个5×5的二维数组 赋值1到25的自然数,然后输出该数组的左下半三角。试编程。提示:多维数组,也就是数组里面的数据也是数组(二维数据),会涉及数据的存储区别

// 结果
[
  [1, 2, 3, 4, 5],
  [6, 7, 8, 9, 10],
  [11, 12, 13, 14, 15],
  [16, 17, 18, 19, 20],
  [21, 22, 23, 24, 25]
]
1
6  7
11 12 13
16 17 18 19
21 22 23 24 25

 // 
        var bigArr = [];
        var smallArr = [];
        for (var i = 1; i <= 25; i++) {
            smallArr.push(i);
            if (i % 5 == 0) {
                bigArr.push(smallArr);
                // 重新给 smallArr赋值一个空的地址
                smallArr = [];
            }
        }
        // console.log(bigArr[0][0]);
        // console.log(bigArr[1][0]);
        // console.log(bigArr[1][1]);

        // console.log(bigArr[2][0]);
        // console.log(bigArr[2][1]);
        // console.log(bigArr[2][2]);

        for (var i = 0; i < bigArr.length; i++) {
            // bigArr[i] 小数组
            // bigArr[0] 只打印一个数据 ,小数组中的第一个 内层循环只需要循环一次
            // bigArr[1] 要打印两个数据  内层循环两次

            // 内层循环取出二维数组中列的数据
            for (var j = 0; j <= i; j++) {
                document.write(bigArr[i][j]);
            }
            document.write('<br>')
        }

编写函数norepeat(arr) 将数组的重复元素去掉,并返回新的数组

 // 编写函数norepeat(arr) 将数组的重复元素去掉,并返回新的数组
    
    function noRepeat(array) {
      var newArr = [];

      // 去重 
      // 循环的把原始属数组的数据添加到新数组中
      outer: for (var i = 0; i < array.length; i++) {
        // 如果新数组中已经存在的数据,那么久不需要往新数组添加此数据
        // 用当前的这个数据与新数组中每一个元素比较
        for (var j = 0; j < newArr.length; j++) {
          if (array[i] === newArr[j]) {
            // 如果原始数组的数据 跟新数组的数据一样的 ,说明新数组已经存在这个数据了,就不需要往新数组添加此数据
            // 不需要往新数组中添加这条数据, 需要进行下一次与数据的匹配
            // 拿到原始数组的下一个数据  跳过外层循环的本次循环 进入下一次外层循环
            continue outer
          }
        }
        newArr.push(array[i])

      }

      return newArr
    }
    var arr = [1, 2, 3, 1, 67, 8, 9, 8, 3, 2, 1]
    var res = noRepeat(arr)

编写一个函数,传一个数组,在原始数组的基础上增加30% ,返回增加之后的新数组


 <script>
    // 编写一个函数,传一个数组,在原始数组的基础上增加30% ,返回增加之后的新数组
    // function map(array) {
    //     // vra array = arr;
    //     // 在原始数组中每一个数据增加30% 
    //     var newArr = [];
    //     for (var i = 0; i < array.length; i++) {
    //         newArr.push(array[i] * 1.3)
    //     }
    //     return newArr

    // }
    // var arr = [10, 20, 30, 40];
    // var res = map(arr);\\

    // 在原始数组的数据上 + 10 ,返回一个新数组
    function map(array, callback) {
      var newArr = [];
      for (var i = 0; i < array.length; i++) {
        // newArr.push(array[i] + 10)
        // 直接在函数内部写计算,函数不灵活,只能进行默认写好的计算
        // 给函数添加一个回调函数
        //  newArr.push(callback(array[i])) 把回调函数的返回值 push到新数组
        // callback(array[i]) 调用回调函数,并且把原始数组的数据当成回调函数的实参
        newArr.push(callback(array[i]))
      }
      return newArr

    }
    var arr = [10, 20, 30, 40];
    // 当在函数内部调用回调函数的时候 会执行
    // function (value) {
    //  return value * 1.3
    // }
    // value = 原始数组的每一个数据
    var res = map(arr, function (value) {
      // 拿到 原始数组的数据,进行相应的操作
      // 并且把操作的结果当成 回调函数的返回值
      return value * 1.3
    });
    var res1 = map(arr, function (value) {
      return value + 100
    })
  </script>
  

字符串题

统计字符串中每个字符的个数?以对象的形式返回

 <script>
    /*
        1.统计字符串中每个字符的个数?以对象的形式返回
     */
    var str = 'abcdacbabcbababcbabcabd';
    var obj = {}; //记录字符出现的次数
    for (var i = 0; i < str.length; i++) {
      // 判断对象中是否存在 
      if (str[i] in obj) {
        // 存在的情况 让这个属性的属性值 +1
        obj[str[i]] += 1
      } else {
        // 不存在的情况下,添加此属性,并且属性值为 1
        obj[str[i]] = 1;
      }
    }
    

字符串去重

  // 2.字符串去重
    var str1 = 'abcdacbabcbababcbabcabd'; //字符串去重
    var str2 = ''; //存放去重之后的字符串
    // 拿str1中的字符去 判断是否已经存在 str2中
    // 如果存在,是一个重复的字符,不需要把此字符添加到str2中
    // 如果不存在时候,需要把此字符添加到 str2 中
    for (var i = 0; i < str1.length; i++) {

      // 判断str2中是否存在str1[i]这个字符
      if (str2.indexOf(str1[i]) === -1) {
        str2 += str1[i]
      }
    }

寻找连续5位数中的最大数

 // 3.寻找连续5位数中的最大数
    var res = '9234567890';
    // 假设maxNum为一个最大值
    var maxNum = 0;
    for (var i = 0; i < res.length - 4; i++) {
      var num = res.substr(i, 5);
      // 组成的5位数为 字符串 ,当字符串的比较不会比较大小,而是比较他们ASCII码
      // 把字符串转换为数值 在进行比较

      // 如果num的值比maxNum的值大,把num的值赋值给maxNum
      if (maxNum < Number(num)) {
        maxNum = Number(num);
      }

    }
    console.log(maxNum)

随机生成一个五位以内的数,然后输出该数共有多少位,每位分别是什么。

  // 4.随机生成一个五位以内的数,然后输出该数共有多少位,每位分别是什么。
    var randomNum = parseInt(Math.random() * 10000); //得到一个5位以内的随机整数

    // 因为数值没有length属性,把数值转成字符串
    randomNum += '';
    console.log('该为' + randomNum + '是一个' + randomNum.length + '位数');

    for (var i = 0; i < randomNum.length; i++) {
      console.log('第' + (i + 1) + '为' + randomNum[i]);
    }

计算字符串中最长的字符串和长度

 // 计算最长字符串并输入长度和那个最长
    var s = 'I love you forever too';
    var arr = s.split(' ');
    // console.log(arr) //转为数组
    // console.log(arr[3])  //字符串
    var arr2 = [];
    for (var i = 0; i < arr.length; i++) {
      arr2.push(arr[i].length);
    }
    arr2 = arr2.sort(function (a, b) {
      return a - b
    });
    // console.log(arr2) // [1, 3, 3, 4, 7]
    // 得出最长的字符串的长度
    var maxLength = arr2[arr2.length - 1];
    for (var i = 0; i < arr.length; i++) {
      if (arr[i].length == maxLength) {
        console.log(arr[i]);  //forever
        console.log(arr[i].length); //7
      }
    }

以上看似简单,但是可能要动脑子啊,哈哈哈

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值