本文是锻炼编程逻辑思维的一些题的归纳,红色字体是个人认为初学比较难懂的题。
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 +" "); } 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)+" "; 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>