|
本文是锻炼编程逻辑思维的一些题的归纳,红色字体是个人认为初学比较难懂的题。
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==result[j]){
break;//退出循环
}
}// 遍历结束
// 如果j等于result的length 表示这个元素在新数组中不存在
if(j==result.length){
// 将arr中当前元素,追加result末尾
result[result.length]=arr;
}
}// 遍历结束
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 = prompt("请输入一个整数");
alert("已经输入了"+(i+1)+"次");//弹框提示输入了几次
}
console.log(arr);
var max=arr[0];//声明一个变量,用来存储最大的值
for(i=0;i<arr.length;i++){//遍历arr【】中的所有的数字
if(max<arr){//如果比后面元素数字小的话就,换位置,保证第一个元素是最大的
var temp ;//声明一个空值来换位置
temp=max;
max = arr;
arr = temp;
}
}
console.log("最大值为"+max);
var min=arr[0];
for(i=0;i<arr.length;i++){
if(min>arr){
var temp ;
temp=max;
min = arr;
arr = 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 = prompt("请输入十个整数");
alert("已经输入了"+(i+1)+"次");
}
//声明一个变量,存储用户输入要查找的数字
var num= prompt("输入要查找的数字")
//遍历数组
for(i=0;i<arr.length;i++){
if(num == arr){
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 =Number( prompt("请输入商品的价格:"));
console.log("商品单价是"+arr);
alert("已经输入了"+(i+1)+"件商品");
}
//计算总和
for(i=0;i<10;i++){
sum+=arr;
}
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 = 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){
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=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= "000"+num.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= word.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.charCodeAt()).length==1){
35 morse="0000"+morse.charCodeAt();
36 }
37 if(String(morse.charCodeAt()).length==2){
38 morse="000"+morse.charCodeAt();
39 }
40 if(String(morse.charCodeAt()).length==3){
41 morse="00"+morse.charCodeAt();
42 }
43 if(String(morse.charCodeAt()).length==4){
44 morse="0"+morse.charCodeAt();
45 }
46 if(String(morse.charCodeAt()).length==5){
47 morse=morse.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= 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>
来源:https://www.cnblogs.com/wangzheng98/p/10864424.html |