js-work算法练习题

338 阅读1分钟

1.在控制台输出1~1000之中,所有能被5整除,或者被6整除的数字。

        var num = 0;
        for(var i = 1; i <= 1000; i++) {
            if(i%5 === 0 && i%6 === 0){
                console.log(i);
            }
        }
         /* function getNumber(){
            for(var i = 1; i <= 1000; i++){
                (i % 5 == 0 && i % 6 == 0) ? console.log(i) : ''
            }
        }

        getNumber() */

2.用户输入一个数字n,计算1+2+3+4+……n的和。

        var num = 0;
        var x = prompt('输入一个数字');
        for (var i = 1; i <= x; i++) {
            num += i;
        }
        console.log(num);
         /* function getSum(){
            var number = prompt('请输入一个数字');
            var sum = 0;
            for(var i = 1; i < number.length; i++){
                sum += i;
            }
        } */

3.用户输入一个数字n,计算3/2+4/3+5/4+......+(n+1)/n。

        var n = prompt()
        var x = 0;
        for(var i = 2; i <= n; i++) {
            x+= (i+1)/i
            console.log(i);
        }
        console.log(x);
         /* function getSum(){
            var n = prompt('请输入一个数字');
            var sum = 0;
            for(var i = 2; i < n; i++){
                sum += (i+1)/i;
            }
        }
        getSum(); */

4.用户输入一个数字,在控制台中列出它的所有约数。

        var num = prompt()
        for(var i = 0; i <= num; i++) {
                if(num % i === 0){
                    console.log(i);
                }   
            }
         /* function getYue(){
            var number = prompt('请输入一个数字');
            for(var i = 1; i < number; i++){
                if(number % i == 0){
                    console.log(i+"是一个约数")
                }
            }
        }
        getYue(); */

5.大家从小到大,都玩儿过的一个庸俗的游戏:

    游戏玩儿法就是,大家轮流报数,如果报到能被7整除的数字,
    或者尾数是7的数字,都算踩地雷了。就应该罚唱歌。
    请在控制台输出1~60之间的所有“安全数”。
    比如:1、2、3、4、5、6、8、9、10、11、12、
    13、15、16、18、19、20、22、23、24、25、26、29、30……
    for(var i = 1; i <= 60; i++) {
            if(!(i%7 === 0 || i%10 === 7)){
                console.log(i);
            }
        }
    /*  function playGame(){
            for(var i = 1; i <= 60; i++){
                if(i % 7 == 0 || i % 10 == 7){
                    continue;
                }else{
                    console.log(i)
                }
            }
        }
        playGame(); */

7.水仙花数

水仙花数是一种特殊的三位数,它的特点就是,每个数位的立方和,
等于它本身。比如153就是水仙花数。因为:1^3 + 5^3+ 3^3 = 153。
那么100~999之内,只有4个水仙花数,请编程找出来。

    for(var i = 100; i<= 999; i++){
        var g = i % 10;
        var s = parseInt((i/10) % 10) ;
        var b = parseInt(i / 100) ;
        if(((g*g*g)+(s*s*s)+(b*b*b)) == i){
            console.log(i);
        }
    }
     /* function getCountNumber(){
            for(var i = 100; i <= 999; i++){
                var a = i % 10;
                var b = parseInt(i / 10) % 10;
                var c = parseInt(i / 100);

                // 求立方和
                // var sum = a**3+b**3+c**3;
                var sum = Math.pow(a,3) + Math.pow(b,3) + Math.pow(c,3);
                sum == i && console.log(i)
            } 
        }

        getCountNumber(); */

8.如果一个数恰好等于它的因数之和,则称该数为“完美数”。

    例如:第1个完全数是6,它有因数1、2、3、6,除去它本身6	
    外,其余3个数相加,1+2+3=6。第2个完全数是28,它有因数1、	
    2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
    试寻找1~10000之间的所有完美数

    /* for (var i = 1; i <= 10000; i++) {
            var x = 0;
            for (var l = 0; l < i; l++) {
                if (i % l === 0) {
                    x += l;
                }
            }
            if (x === i) {
                console.log(i);
            }
        } */
        
        function getNumber(){
            for(var i = 1; i <= 10000; i++) {
                var sum = 0;
                for(var item of getNumberArray(i)){
                    sum += item;
                }
                sum == i && console.log(i + '是一个完美数');
            }
        }

        function getNumberArray(number){
            var arr = [];
            for(var j = 1; j < number; j++){
                if(number % j == 0){
                    arr.push(j)
                }
            }
            return arr;
        }

        getNumber()

9.用户输入一个数字,判断这个数字是否是质数。

        var num = prompt();
        function getNum(num) {
            if (num == 0 || num == 1) {
                return num + '不是质数';
            }
            for (var i = 2; i < num; i++) {
                if (num % i == 0) {
                    return num + '不是质数';
                }    
            }
            return num + '是质数';
        }
        alert(getNum(num));

10.列出1~10000的所有质数。

        for(var i = 2; i<= 10000; i++) {
            var sum = true;
            for(var j = 2; j< i; j++) {
                if(i % j == 0){
                    sum = false;
                }
            }
            if(sum == true){
                console.log(i);
            }
        }

11.苹果3元一个,鸭梨2元一个,桃子1元一个。现在想用200元买100个水果

在控制台中列出所有可能性

        var a = 0;
        var b = 0;
        var c = 0;
        var apple = 3;
        var pear = 2;
        var peach = 1;

        for(a = 0; a<=66;a++){
            for(b = 0; b<=100;b++){
                for(c =0;c<=100;c++){
                    if(a+b+c == 100 && (a*apple) + (b*pear) + (c*peach) <= 200 ){
                        console.log(a,b,c);               
                    }
                }
            }
        }

        /* function getNumber(){
            for(var appleCount = 0; appleCount <= 100; appleCount++){
                for(var pearCount = 0; pearCount <= 100; pearCount++){
                    for(var pearchCount = 0; pearchCount <= 100; pearchCount++){
                        if(appleCount + pearCount + pearchCount == 100 && appleCount*3 + pearCount*2 + pearchCount <= 200){
                        console.log(appleCount,pearCount,pearchCount)
                    }
                    }
                    
                }
            }
        }
        getNumber(); */

12.求1! + 2! + 3! + 4! + …… + 10!的和,叹号表示阶乘,如4! = 1 * 2 * 3 * 4

        var sum =1;
        var sums = 0;
        for(var i = 1 ; i <=10;i++) {
           sum*=i;
           sums += sum;
        }
        console.log(sums);

         /* function getNumber(){
            var sum1 = 0;
            for(var i = 1; i <= 10; i++){
                var sum = 1;
                // 求阶乘
                for(var j = 1; j <= i; j++){
                    sum *= j;
                    // sum = sum * j
                }
            }
            sum1 += sum;
            console.log(sum1)
        }
        getNumber(); */

13.求一个三位数,该三位数等与其每位数字的阶乘之和。

        for (var n = 100; n < 1000; n++) {
            var a = parseInt(n / 100)
            var b = parseInt(n / 10) % 10
            var c = parseInt(n % 10)

            if (n == fun(a) + fun(b) + fun(c)) {
                console.log(n);
            }
        }

        function fun(i) {
            var n = 1;
            var s = 1;

            while (n <= i) {
                s *= n;
                n += 1;
            }
            return s
        }


       /*  function jc(a) {

            mul = 1;
            for (i = 1; i <= a; i++) {

                mul *= i;
            }
            return mul;
        }
        //判断三位函数
        function isfree(i) {

            //拆分位数
            var g = i % 10;
            var s = parseInt(i / 10) % 10;
            var b = parseInt(i / 100);
            //计算各个位数阶乘之和
            var sum = jc(g) + jc(s) + jc(b);
            //判断与i是否相等
            if (sum === i) {

                return true;
            } else {

                return false;
            }
        }

        for (var j = 100; j <= 999; j++) {

            if (isfree(j)) {

                console.log(j + "是这个三位数");
            }
        } */

         /* function getNumber(){
            for(var i = 100; i <= 999; i++){
                i == getSum(i) && console.log(i)
            }
        }
        function getSum(number){
            var array = (number + '').split('');
            var sum1 = 0;
            for(var item of array){
                var sum = 1;
                for(var j = 1; j <= item; j++){
                    sum *= j;
                }
                sum1 += sum;
            }
            return sum1;
        }
        getNumber() */

14.编写一个函数rev用于将一个整数前后倒置。

        例如rev(12345)将返回54321rev(123)
        将返回321,整数位数不限制,多少位都行。
        
        function rev(number) {
            var sum = ''

            while(number){
                sum += number % 10
                number = parseInt((number / 10))
            }
            console.log(sum/1);
            return sum 

            /* while (!null) {
                sum += number % 10;
                number = parseInt((number / 10));
                if (!number) break;
            }
            console.log(sum / 1) */
        }
        rev(12345)

        /* function rev(number){
            var strArray = (number + '').split("").reverse();
            var str = '';
            for(var item of strArray){
                str += item;
            }
            console.log(str/1)
        }
        rev(12345) */

15.如果整数A 的全部约数(包括1,不包括A 本身)之和等于B,且整数B 的全部约数(包括1,不包括B 本身)之和等于A,则称整数A和B是一对亲密数。求3000 以内的全部亲密数。

         function yueshuhe(a) {

            var sum = 0;// 累加器
            // 循环累加约数
            for (var i = 1; i < a; i++) {

                if (a % i === 0) {

                    sum += i;
                }
            }
            // 循环结束后,sum 中存了 a 的约数和
            return sum;
        }

        // 制作判断亲密数函数
        // 说明:输入一个数,判断是否有亲密数
        function isintimatenumber(a) {

            // 一个数如果有亲密数,那么这个亲密数肯定是 a 的约数和
            // 直接求 a 的约数和
            var b = yueshuhe(a);
            // 反推 b 的约数和是否等于 a,如果相等就是亲密数,a 不能等于 b
            if (yueshuhe(b) === a && a != b) {

                return true;
            } else {

                return false;
            }
        }

        // 直接输出 3000 以内的亲密数
        for (var i = 1; i <= 3000; i++) {

            var j = yueshuhe(i);
            if (isintimatenumber(i) && j <= 3000) {

                console.log(i + "和" + j + "是亲密数");
            }
        }

         /* function loveNumber(){
            for(var i = 1; i <= 1000; i++){
                for(var j = 1; j <= 1000; j++){
                    if(getLoveNumberSum(i) == j && getLoveNumberSum(j) == i){
                        console.log(i+'和'+j+'是亲密数')
                    }else{
                        continue;
                    }
                }
            }
        }
        function getLoveNumberSum(number){
            var sum = 0;
            for(var j = 1; j < number; j++){
                if(number % j == 0){
                    sum += j;
                }

            }
            return sum;
            
        }
        loveNumber() */

16.编写函数repeat(char,n) 实现重复char字符串n次,

比如repeat("★",6) 返回"★★★★★★"

         function repeat(char,n){
            // var str = '';
            var array = [];
            for(var i = 0; i < n; i++){
                // str += char;
                array.push(char)
            }
            // '1111111'
            return array.join('');
        }
        /*repeat(prompt('请输入一个字符串'),prompt('请输入重复多少次')) */

17.在控制台输出图形

        	  *
        	 ***
                *****
               *******
              *********
                  
        function print(){
            var n = prompt('请输入三角形的层数');
            for(var i = 0; i < n; i++){
                // console.log(" ".repeat(n-i-1)+"*".repeat(i*2+1))
                console.log(repeat(" ",n-i-1)+repeat("*",i*2+1))
            }
          }
          print()

18.编写函数rev(char) 实现将字符串char倒置,比如rev("spring") 返 回"gnirps"

        function rev(str){
            // var array = str.split('').reverse().join('');
            // console.log(array)
            var array = str.split('');
            var newArray = [];
            var i = array.length - 1;
            for(var item of array){
                // newArray.unshift(item)
                newArray[i] = item;
                i--;
            }
            console.log(newArray.join(''))
        }
        rev("spring")

9.将字符串"i come from beijing"倒置,即控制台输出"beijing from come i",语句直接写在程序中,不需要用户输入

        function comeForm(){
            var char = 'i come from beijing';
            var charArray = char.split(' ');
            console.log(charArray.reverse().join(' '));
            /* var newArray = [];
            var i = charArray.length - 1;
            for(var item of charArray){
                // newArray.unshift(item)
                newArray[i] = item;
                i--;
            }
            console.log(newArray.join(' ')) */
        }
        comeForm()

20.编写函数rightchange(char,n)实现字符串char循环右移n位。

比如rightchange("abcdefg",2) 返回"fgabcde"
        function moveright(str,k){
            var strArray = str.split('');

            for(var i = 0; i< k; i++){
                strArray.unshift(strArray.pop())
            }
            console.log(strArray.join(''));
        }
        moveright('abcdefg',2)

21.编写函数maxr(char) 返回字符串char中最长的连续重复字母

比如maxr("mmmiijjjjkkkkkkssptr") 返回"kkkkkk"
         function logRev(str){
            var newStr = '';
            var newStrLength = 0;

            for(var i = 0; i < str.length; i++){
                for(var j = i+1; j < str.length; j++){
                    var substr = str.substring(i,j+1)
                    var char = substr.charAt(0)
                    var flage = true;

                    for(var k = 1; k < substr.length; k++){
                        if(char != substr.charAt(k)){
                            flage = false;
                            break;
                        }
                    }
                    if(flage){
                        if(substr.length > newStrLength){
                            newStr = substr;
                            newStrLength = substr.length;
                        }
                    }else{
                        break;
                    }
                }
            }
            return newStr;
        }
        console.log(logRev('mmmiijjjjkkkkkkssptr'));

22.有10个学生的成绩存在数组中,请统计大于等于平均成绩的人数。成绩直接以数组形式写在程序中,不需要用户输入

        function countGrades(grades){
            var array = [];
            var avgSum = 0;
            for(var item of grades){
                // 平均分
                avgSum += item/grades.length
            }
            for(var item of grades){
                if(item >= avgSum){
                    array.push(item)
                }
            }
            console.log('平均数是:'+avgSum)
            console.log('大于等于平均成绩有:',array)
        }
        countGrades([10,20,30,40,55,60,70,80,90,100])

23.有10个学生的成绩存在数组中,请统计最高分,最低分,并将最高分和最低分学生的下标输出到控制台

        function grades(array){
            var maxgrades = 0;
            for(var i = 0; i <array.length;i++){
                var mingrades = 0;
                for(var j =1; j<array.length; j++){
                    if(i>j){
                        maxgrades = i;
                        
                    }else if(i<j){
                        mingrades =i;
                    }
                }
            }
            return '最大的数是'+array[maxgrades] + '\n'+'最大的数的下标' + maxgrades+ '\n' +'最小的数是'+array[mingrades]+ '\n'+ '最小的数的下标是' +mingrades
            
        }

       console.log(grades([10,20,30,40,55,60,70,80,90,100]));
       console.log([10,20,30,40,55,60,70,80,90,100]);

24.勾股定理:直角三角形中,两个直角边的平方和,等于斜边平方和。寻找三边的长度都不大于100,并且三边边长都是整数的可能,在控制台输出。

        function pythagoreanTheorem(n) {
            for (var i=1; i<=n; i++) {
                for (var j=i;j<=n; j++) {
                    for (var k=j; k<=n; k++) {
                        if((i**2)+(j**2)==(k**2) && (i+j)>=k){
                            console.log(i,j,k);
                        }
                    }
                }
            }

        }

        pythagoreanTheorem(100)

25.编写函数maxsame(char1,char2) 返回字符串char1和char2的最大相同子串,

比如maxsame("abcdefghijklmn","mndefghlm") 返回"defgh"
        function maxsame(str1,str2){
            var newStr = '';
            var newStrLength = 0;
            for(var i = 0; i < str1.length; i++){
                for(var j = i+1; j < str1.length; j++){
                    var substr = str1.substring(i,j+1);
                    if(str2.indexOf(substr) != -1 && substr.length > newStrLength){
                        newStr = substr;
                        newStrLength = substr.length;
                    }
                }
            }
            return newStr;
        }

        // abcde    a ab  abc  abcd  abcde
        // b bc bcd bcde 


        console.log(maxsame('abcdefghijklmn','mndefghlm'))

26.将"i love javascript cai guai"的每个单词的第一个字母,变为大写。

    /* function Becomeuppercase(str){
             var array = str.split(' ')

             for(var i = 0; i < array.length; i++){
                // console.log(i);
                array[i] = array[i].replace(array[i][0],array[i][0].toUpperCase())
                // console.log(array[i][0].toUpperCase());
             }
             array = array.join(' ')
             return  array
        } 
        console.log(Becomeuppercase('i love javascript cai guai')); 
        console.log('i love javascript cai guai'); */


        /* function Becomeuppercase(str){
            var newStr = ''
            var array = str.split(' ')
            // var array1 = []  // 第二种方法
            // console.log(array);
            
            for(item of array){
                // console.log(item[0]);
                item = item.replace(item[0],(item[0]).toUpperCase())
                // console.log(item);
                newStr += item + ' '

                // array = item.replace(item[0],(item[0]).toUpperCase())
                // array1.push(array)
            }
            console.log(newStr);
           
            //转字符串写法
            //  console.log(array1.join(' '));
        }
        Becomeuppercase('i love javascript cai guai') 
        console.log('i love javascript cai guai'); */

        function firstLowCase(str) {
            var str1 = str.split(' ');
            var tmp1 = '';
            console.log(str1);
            for (var i of str1) {
                var a = i.charAt(0).toUpperCase();
                var b = i.substring(1);
                console.log(a,b);
                var res = a + b + ' ';
                tmp1 += res;

            }
            return tmp1;
        }
        console.log(firstLowCase('i love javascript cai guai'));

27.八皇后算法在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法

        function eightEmpress(a , cur){
            if(cur == a.length){
                console.log(a)
                return;
            }
            for(var i = 1; i <= a.length; i++){ 
                a[cur] = i

                var flag = true;

                for(var j = 0 ; j < cur ; j++){ 
                    var ab = i - a[j]; 
                    if(a[j] == i || (ab > 0 ? ab : -ab) == cur - j){
                        flag = false;
                        break;
                    }
                }
                if(flag){
                    eightEmpress(a , cur + 1) 
                }
            }
        }   
        eightEmpress([1,1,1,1,1,1,1,1],0)