首页 > 技术文章 > JavaScript 练习题

wangzheng98 2019-05-14 20:34 原文

本文是锻炼编程逻辑思维的一些题的归纳,红色字体是个人认为初学比较难懂的题。

1.日期计算器:用户输入年月日,计算并打印出来是今年的第几天,星期几

 1 function data(){
 2                 //首先输入年月日
 3                 //1900年 1月1日为周一
 4                 var year =Number(prompt("请输入今年是哪一年 :")) ;
 5                 var month =Number(prompt("请输入是哪个月:")) ;
 6                 var day = Number(prompt("请输入今天是几号:")) ;
 7                 var i = 1;
 8                 var sum =0;
 9                 while(i<month){
10                     switch (i){
11                         case 1:
12                         case 3:
13                         case 5:
14                         case 7:
15                         case 8:
16                         case 10:
17                         sum= sum +31;
18                             break;
19                             
20                         case 2:
21                         if(year%400==0 || (year%4==0 && year!=0)){
22                             sum = sum+29;
23                         }else{
24                             sum = sum +28;
25                         }
26                             break;
27                             
28                         case 4:
29                         case 6:
30                         case 9:
31                         case 11:
32                         sum = sum+30;
33                             break;
34                     }
35                     i++;
36                 }
37                 sum = sum + day;
38                 document.write("今天是这一年的第"+sum +"天");
39             
40                 //计算今天周几已知1900的一月一日是周一,计算出1900到现在一共有几天
41                 for(var y=1900;y<=year;y++){ //year是自己输入要查询的年份,在年份到1900之间所有的
42                     //y表示从1900年开始的每一年
43                     if(year%400==0 || (year%4==0 && year!=0)){
44                         sum += 366; //如果是闰年就加366天
45                     }else{
46                         sum += 365;
47                     }
48                 }
49                 //计算今天是周几
50                 var week= sum%7;//取7余数就是周几(如果一月一号正好是周一的话)
51                 switch (week) {
52                     case 0:
53                         console.log("今天星期日");
54                         break;
55                     case 1:
56                         console.log("今天星期一");
57                         break;
58                     case 2:
59                         console.log("今天星期二");
60                         break;
61                     case 3:
62                         console.log("今天星期三");
63                         break;
64                     case 4:
65                         console.log("今天星期四");
66                         break;
67                     case 5:
68                         console.log("今天星期五");
69                         break;
70                     case 6:
71                         console.log("今天星期六");
72                         break;
73                 }
74             } 
75         </script>

2.判断101-200之间有多少个素数,并输出所有素数。

其中定义布尔类型做判断是开关逻辑思想,会常用。

        <script type="text/javascript">
            function prime(){
//                for(var i=2;i<=100;i++){//打印出2-100的所有的数字
//                    var flag = true;//定义一个布尔类型的值,
//                        //console.log(i);
//                    for(var j =2;j<i;j++){//可以输出j到i之间的数字,在这之间的数字判断是否还有和i之间可以取余的
//                        //判断i是否能被j整除,取余为0代表可以被j整除,就不是素数,在不是宿舍的时候不进入
//                        if(i%j==0){
//                            flag = false;
//                        }
//                    }
//                    if(flag){
//                        console.log(i);
//                    }//当flag为真的时候,输出i
//                }
//            }

            //方法二(类似)
            var flag = false;//先定义一个开关并且赋值布尔类型用来判断
            for (var i=2;i<100;i++){//控制需要判定的数字,从二开始递增到100
                for(var j = 2; j<i;j++){//控制i以内的除数,必须比i小
                    if(i%j == 0){//判定i和j之间是否可以被整除,如果存在个j可以整除i,则不为素数
                        flag = false ;//不是素数的话就 把flag的值改为false
                        break;//跳出循环
                    }
                    else{//else则是素数的
                        flag = true;
                        }//是素数的话就输出i
                }
                if(flag){//输出放在大循环中,是素数就输出一次
                    //count++;
                     console.log("素数:"+i);
                }

            }
        }
        </script>

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

 1     <!--打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。-->
 2         <button onclick="flower()">水仙花数</button>
 3         <!--水仙花数是从100到1000的三位数-->
 4         <script type="text/javascript">
 5             var a,b,c;//声明三位数的三位变量
 6             function flower(){
 7                 for(var i=100;i<1000;i++){//遍历一百到一千的所有数字
 8                     a= i%10;//三位数的个位数     例如153 a=3...27  b5...125 c1....1
 9                     b =parseInt((i/10)%10);//十位数
10                     c =parseInt(i/100) ;  //百位数  
11 //                    console.log(a,b,c);  先看一眼对不对;
12                 if(i== a*a*a+b*b*b+c*c*c){//是否满足水仙花数的条件
13                     document.write(i+"<br />")
14                 }
15                 }
16             }
17         </script>

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

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。

(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

<button onclick="number()">分解质因数</button>
        <!--将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 
        程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: 
        (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 
        (2)如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。 -->
        <script type="text/javascript">
            //思路 90/2=45
//                45/3=15
//                15/3=5
//                90为输入的数字,分解数字应该是从2开始的,如果不行就递增的过程
//                分解后的值应该重新定义在新的输入的变量中,一次打印出分解数字
            function number(){
                var num = prompt("请输入一个数字");
                    for(var i = 2;i<num;i++ ){//i为分解的因数  所以 i必须小于num,在num之间找到分解的因数i
                        while(num%i==0 && num!=k){//如果成立的话,表示num被i分解
                            console.log(i);//打印出来因数i
                            //将分解的数字重新赋值继续计算,此刻就如同分析中的第二步骤,将计算出来的45赋值给num
                            num = num /i;
                        }
                        //如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可.
                        if(num==k){
                            console.log(k);
                            break;
                        }
                    }
            }
        </script>

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

    <button onclick="aa()">求叠加数字的和</button>
        <!--求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。-->
        <script type="text/javascript">
            //函数思路:前面一项乘以10再加上a,就是aa
            function aa(){
                var a = parseInt(prompt("请输入一个数字:"));//假设输入2
                var count =parseInt(prompt("请输入一个数字需要叠加的个数:")) ;//输入4
                var sum = 0,n=0;//n表示每一个数的加数,sum用来存储相加的和  
                for(var i=0; i<=count;i++){//表示从零开始到输入的个数  
                    n = n*10+a; //假设 n = 2  第二轮 n= 10+2
                     sum = sum+n;//sum = 2 
                }
                console.log(sum);
            }
        </script>

 

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

 1     <button onclick="fun6()">猴子</button>
 2         <script type="text/javascript">
 3             //思路:sum/2+1=猴子第一天吃的
 4             //第九天吃只剩 下一个了,就是i=9的时候  sum = 2*sum+1
 5             //逆向思维,从最后一天开始算
 6             function fun6(){
 7                 var sum = 1,i=9;//i是天数,sum是剩下的
 8                 while(i>=1){
 9                     sum = 2*sum+1  //当i为9的时候,sum为1  1/2-1,剩下了一个
10                     i--;
11                 }
12             console.log(sum);
13             }
14     </script>

7.计算用户输入的数字的阶乘,例如用户输入的是5,则计算5的阶乘,5的阶乘为 5*4*3*2*1

        <!--计算用户输入的数字的阶乘,例如用户输入的是5,则计算5的阶乘,5的阶乘为 5*4*3*2*1-->
        <!--思路:接收用户输入:n;
            2.阶乘的计算方法是n*(n-1)*(n-1-1)直到为1 利用循环实现
        -->
        <script type="text/javascript">
            function fun8(){
                //接收用户输入
                var n = prompt("请输入一个数字:计算它的阶乘");
                var fac = 1;
                //再定义一个变量用来存储其他乘数
                for(var i=1;i<=n;i++){
                    fac = fac*i;
                }
            console.log(fac);
            }
        </script>
        <button onclick="fun8()">计算阶乘</button>

8.定义一个函数,返回1+1/3+1/5+1/7+....1/n的和

<!--定义一个函数,返回1+1/3+1/5+1/7+....1/n的和-->
        <script type="text/javascript">
            //思路逻辑:从一开始,每次增加二,加到n
            function fun9(){
            //接受用户输入的n,再定义一个变量来接收他们的和
                var n =parseFloat( prompt("请输入一个数:"));
                var sum =0;
                //从1开始的循环,每次增加两个
                for(var i=1;i<=n;i+=2){
                    sum = sum + (1/i);
                    //var test = parseFloat(1/i) ; 测试用的
                }
                console.log(sum);
            }
        </script>
<button onclick="fun9()">求....的和</button>

9.定义一个函数,打印九九乘法口诀表

<button onclick="fun10()">乘法口诀表</button>
        <!--打印乘法口诀表-->
        <script type="text/javascript">
            //逻辑:每一列中输出i个乘法式,列循环不成立输出一个换行,行+1继续循环列
            function fun10(){
                for(i=1;i<=9;i++){//控制行
                    for(j=1;j<=i;j++){//控制列
                        var pro = i*j;
                        document.write(i+"*"+j+"="+pro +"\t");
                    }
                    document.write("<br />")
                }
            }
        </script>

 10.有一张0.0001米的纸,对折多少次可以达到珠穆朗玛峰的高度8848;

<!--.有一张0.0001米的纸,对折多少次可以达到珠穆朗玛峰的高度8848m;-->
        <script type="text/javascript">
            function mountain(){
                var h =0.0001;
                for(var i=1;i>0;i++){//这个循环表示每次折叠h高度增加两倍,i用来存储折叠的次数。
                    h=h*2;
                    if(h>8848){//如果高度一定达到了,8848的时候就跳出循环
                        break;
                    }
                }
            }
            console.log(i);
        </script>
        <button onclick="mountain()">计算珠峰</button>

11.羽毛球拍15元,球3元,水2元。200元每种至少一个,有多少可能羽毛球拍最多买13个 球最多买66个 水最多买100个

<!--羽毛球拍15元,球3元,水2元。200元每种至少一个,有多少可能 羽毛球拍最多买13个 球最多买66个 水最多买100个-->
        <!--思路:每个都循环出所有的可能性,然后在符合相加=200的时候输出-->
        <script type="text/javascript">
            //声明一个变量存储可能性的数值
            var pos=0;
            for(var i=1;i<=13;i++){//羽毛球拍
                for(var j=1;j<=66;j++){
                    for(var k=1;k<=100;k++){
                        if(i*15+j*3+k*2){//每次符合条件的可能性就自动加一
                            pos++;    
                        }
                    }
                }
            }
            console.log(pos);
        </script>

 

12.定义函数,去掉数组中重复元素

// 2.定义函数,去掉数组中重复元素
        function unique(arr){

            // 1.循环从arr中取值,i从0,同时创建空数组result
            for(var i=0,result=[];i<arr.length;i++){
                // 2. 循环遍历result,j从0
                for(var j=0;j<result.length;j++){
                    // 3.如果result中当前元素等于arr中当前元素  arr中的这个数在新数组中已经存在
                    if(arr[i]==result[j]){
                        break;//退出循环
                    }
                }// 遍历结束
                // 如果j等于result的length  表示这个元素在新数组中不存在 
                if(j==result.length){
                    // 将arr中当前元素,追加result末尾
                    result[result.length]=arr[i];
                } 
                    
            }// 遍历结束
            return result;// 给出返回值
        }
        function testUnique(){
            var arr=[1,1,2,2,3,4,3,5,6];
            var result=unique(arr);
            console.log(result);
        }

 13.从键盘接受10个整数,求出其中的最大值和最小值。

<script type="text/javascript">
            function max_min(){
                //定义一个数组,接收用户输入
                var arr=[];
                for(var i=0;i<10;i++){//接收用户输入十次(因为是从0开始的所以i<10),在十次结束后
                    arr[i] = prompt("请输入一个整数");
                    alert("已经输入了"+(i+1)+"次");//弹框提示输入了几次
                }
                console.log(arr);    
                var max=arr[0];//声明一个变量,用来存储最大的值
                for(i=0;i<arr.length;i++){//遍历arr【】中的所有的数字
                    if(max<arr[i]){//如果比后面元素数字小的话就,换位置,保证第一个元素是最大的
                        var temp ;//声明一个空值来换位置
                        temp=max;
                        max = arr[i];
                        arr[i] = temp;
                    }
                }
                console.log("最大值为"+max);
            
                var min=arr[0];
                for(i=0;i<arr.length;i++){
                    if(min>arr[i]){
                        var temp ;
                        temp=max;
                        min = arr[i];
                        arr[i] = temp;
                    }
                }
                console.log("最小值为"+min);
            }
        </script>
        <button onclick="max_min()">输入数字,求最大值和最小值</button>

14.输入10个数,保存在一个数组中,在数组中查找某个数字,给出是否找到信息,如果找到了输出该数在数组中所处的位置,如果找不到输出“找不到”

<script type="text/javascript">
            function check(){
                //首先接收用户输入十次
                var arr =[];
                for(i=0;i<10;i++){
                    arr[i] = prompt("请输入十个整数");
                    alert("已经输入了"+(i+1)+"次");
                }
                //声明一个变量,存储用户输入要查找的数字
                var num= prompt("输入要查找的数字") 
                //遍历数组
                for(i=0;i<arr.length;i++){
                    if(num == arr[i]){
                        alert("找到了,在第"+ (i+1)+"位");
                    }
                    else{
                        alert("找不到,输入错了吧");
                    }
                }
            }
        </script>
        <button onclick="check()">查找数字在哪</button>

15.顾客从超市采购了10件商品,编写一个程序,用于接受每件商品的价格,计算应付的总金额。并分别打印出各个商品的价格以及应付的总金额的小票。

    <script type="text/javascript">
            //先写一个空数组,用循环来接收输入的值
            var arr=[];
            var sum = 0;//存储总量
            for(i=0;i<10;i++){
                arr[i] =Number( prompt("请输入商品的价格:"));
                console.log("商品单价是"+arr[i]);
                alert("已经输入了"+(i+1)+"件商品");
            }
            //计算总和
            for(i=0;i<10;i++){
                sum+=arr[i];    
            }
            console.log("商品总价是"+sum);
            
        </script>

 16.编写一个程序,用于产生20个0-10之间的随机数,将这20个随机数存入数组,并通过函数统计这些随机数中某个数出现的次数

思路: 先声明一个数组用来存储所有的随机数的值,然后接受用户输入一个值,依次去比较有没有重复的,有的话计数器(time)加一

 1 <script type="text/javascript">
 2             //先声明一个数组
 3             var arr= new Array(20);
 4             var time=0;
 5             for(var i=0;i<arr.length;i++){
 6                 arr[i] = parseInt(Math.random()*10) ;
 7             }
 8             console.log(arr);
 9             //遍历arr中的所有的数字,
10             var num = Number(prompt("输入一个数判断出现的次数:"))
11             for(var i=0;i<arr.length;i++){
12 //                for(var j=0;j<arr.length-i-1;j++){
13                     if(num==arr[i]){
14 //                        console.log("重复的"+arr[j]);
15                         time++;
16                     }
17 //                }
18             }
19             console.log(time);
20         </script>

17.将一个数组中的元素逆序输出,即第一个元素和最后一个元素交换,第二个数与倒数第二元素交换…..,

例如:原数组为:9 2 5 7 8,逆序后的数组为:8 7 5 2 9

这个题主要是要用逆向排序的思路典型

先声明一个数组,存储用户输入,然后再逆向输出

 

    <script type="text/javascript">
            function fun4(){
                var arr = new Array(6);
                for(var i=0 ;i<arr.length;i++){
                    arr[i]=Number(prompt("请输入第"+(i+1)+"个数字"));
                }
                for(var j=arr.length-1;j>=0;j--){
                    console.log(arr[j]);
                }
    //            arr.reverse();
                console.log(arr);
            }
        </script>

18.对信息加密:每个字符串都转换成Unicode码 保证每一位字符都是五位Unicode码---不够的话用0补上

通过Unicode码解密字符

 1         <button onclick="fix()">加密</button>
 2         <button onclick="auto()">输入一段话加密</button>
 3         <button onclick="decode()">解密</button>
 4         <script type="text/javascript">
 5             function fix(){
 6 //                转换520 1314
 7                 var num = "520 1314";
 8                 //分解为每一个单个的字符
 9                 num = num.split("");
10                 //把每一个元素都转换成Unicode码  并且存入到原数组中
11                 for(i=0;i<num.length;i++){
12                     num[i]= "000"+num[i].charCodeAt();
13                 }
14                 console.log(num);
15                 
16                 //转换汉字 “今天八点,不见不散”
17                 var word = "今天八点,不见不散";
18                 word = word.split("");
19                 for(i=0;i<word.length;i++){
20                     word[i]= word[i].charCodeAt();
21                 }
22                 console.log(word);
23             }
24             
25         function  auto(){
26             var input = prompt("请输入一段话:");
27 //            console.log(input.length); 
28 //             console.log("25715".length);
29 
30             var morse  = input.split("");
31 //            console.log(morse);
32             for(i=0;i<morse.length;i++){
33                 //获取字符串有几位
34                 if(String(morse[i].charCodeAt()).length==1){
35                     morse[i]="0000"+morse[i].charCodeAt();
36                 }
37                 if(String(morse[i].charCodeAt()).length==2){
38                     morse[i]="000"+morse[i].charCodeAt();
39                 }
40                 if(String(morse[i].charCodeAt()).length==3){
41                     morse[i]="00"+morse[i].charCodeAt();
42                 }
43                 if(String(morse[i].charCodeAt()).length==4){
44                     morse[i]="0"+morse[i].charCodeAt();
45                 }
46                 if(String(morse[i].charCodeAt()).length==5){
47                     morse[i]=morse[i].charCodeAt();
48                 }
49             }
50             console.log(morse);
51         }    
52         function decode(){
53             //获取到输入的五位数的密码
54             var input = prompt("请输入一个五位数的Unicode码,不够的用0补齐");
55             password =String.fromCharCode(input);
56             console.log(password);
57         }
58         
59         var msg="今晚八点,不见不散w123";
60         function encode(msg){
61             for (var i = 0,code ="";i<msg.length;i++){
62                 var u =msg.charCodeAt(i);
63                 code += (u+100000+"").slice(1);//u是每个数的Unicode码,把u加上100000再把1去掉第一位一,这种方法最多只能有一位
64             }
65             return code;
66         }
67         var  code = encode(msg);
68         console.log(code);
69         
70         function decode2(code){
71             var information = n0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   ();
72             for(i=0;i<code.length;i+=5){
73                 information[i]= code.slice(i,i+5)+"\t";
74             }
75             console.log(information);
76         }
77         var information = decode2(code);
78         console.log(information);
79         
80         </script>
81         

19. 有一对幼兔,幼兔1个月后长成小兔,小兔1个月后长成成兔并生下一对幼兔,问几年后有多少对兔子,幼兔、小兔、成兔对数分别是多少。

var a,b,c,sum;
             for(var i=1;i<=12;i++){
                 //第一个月的时候
                 if(i==1){
                     a = 1;
                     b = 0;
                     c = 0;
                    sum = 1;
                 }else{
                     c = c + b;
                     b = a;
                     a = c;
                     sum = a + b + c;
                 }
                document.write(i+"个月后有幼兔:"+a+"对,小兔:"+b+"对,成兔:"+c+"对;一共:"+sum+"对。")

20.实现斐波拉切数列 1 1 2 3 5 8 13 21    特点:每前两个数相加等于第三个数, 前两 个数比较特殊,从第三个数开始。

<script type="text/javascript">
   var num1 = 1;
   var num2 = 1;
   var sum = 0;
   for(var i=0;i<5;i++){
    sum = num1 + num2;
    num1 = num2;
    num2 = sum;
    
   }
   document.write(sum);
   sum = sum.toString();
   document.write(sum);
  </script>

 

推荐阅读