尝记还是7,8年前在学校初学编程的时候联系过C语言编程100例,后来去年重拾编程的时候陆陆续续也写过30几题,一直没写完.
虚度光阴这么久了,还是把这100例用JS重拾下. 很多例子都很经典,在实际项目中都会碰到. 在前端逻辑处理的时候有点感觉智商不够用了.
1)排列组合问题:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
//排列组合: 1,2,...,n个数字 能组成 n*(n-1)*(n-2)个三位数, 3<=n<=9 var number = 0; for(var i = 1; i < 5;i++){ for(var j = 1; j< 5; j++){ for(var k = 1; k < 5; k++){ if((i!=j) &&(i!=k) && (j!=k)){ number++; document.write('<p>'+number+') '+i+''+j+''+k +'</p>'); } } } }
2)题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高
于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提
成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于
40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于
100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <body> 2 利润:<input type="number" id="txtInput" onkeyup="getBonus()"/> 3 <hr/> 4 奖金:<input type="text" id="txtBonus" readonly/> 5 <script> 6 function calBonus(profit){ 7 var bonus = 0; 8 if(profit <= 100000){ 9 bonus = profit * 0.1; 10 return bonus; 11 } 12 if(profit <=200000){ 13 bonus = (profit - 100000) * 0.075 + calBonus(100000); 14 return bonus; 15 } 16 if(profit <= 400000){ 17 bonus = (profit - 200000) * 0.05 + calBonus(200000); 18 return bonus; 19 } 20 if(profit <= 600000){ 21 bonus = (profit - 400000) * 0.03 + calBonus(400000); 22 return bonus; 23 } 24 if(profit <= 1000000){ 25 bonus = (profit - 600000) * 0.015 + calBonus(600000); 26 return bonus; 27 } 28 bonus = (profit - 1000000) * 0.01 + calBonus(1000000); 29 return bonus; 30 } 31 function getBonus(){ 32 var bonus = 0; 33 var profit = document.getElementById('txtInput').value; 34 if(profit <= 0){ 35 bonus = 0; 36 }else{ 37 bonus = calBonus(profit); 38 } 39 document.getElementById("txtBonus").value = bonus; 40 } 41 </script> 42 </body>
3)题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
思考:
完全平方数是啥??? 我也不知道,百度百科解释:"完全平方即用一个整数乘以自己例如1*1,2*2,3*3等,依此类推。若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。完全平方数是非负数,而一个完全平方数的项有两个。注意不要与完全平方式所混淆。"
这题有两个解法, 我想出的是根据公式枚举出这两个完全平方数,然后倒推出这个整数,思路如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //我们根据题目可以得到两个公式: a²=x+100;b²=x+268;(a,b是大于0的整数) 2 //代入可得: a² + 168 = b². 枚举找出a,b. 即可找出x 3 function calX(){ 4 for(var i =0; i <= 10000; i++){ 5 for(var j =0; j <= 10000; j++){ 6 if(i * i + 168 == j * j){ 7 var x = i*i - 100; 8 document.writeln(x); 9 10 } 11 } 12 } 13 }
另一个是顺推枚举, 先限定这个整数的范围,然后根据条件直接找出这个整数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //如果一个数的平方根的平方等于该数,这说明此数是完全平方数 2 function calY(){ 3 for(var i = 0; i < 10000; i++){ 4 var x = parseInt(Math.sqrt(i + 100)); 5 var y = parseInt(Math.sqrt(i + 268)); 6 if((x * x - 100 == i) && (y * y - 268 == i)){ 7 document.writeln(i); 8 } 9 } 10 }
下面是输出的结果,可以看到第一个结果比第二个多了一个解: -99. 题目没有限定这个整数是正整数还是负整数, 但是完全平方数却是非负数的. 所以还是第一个解法获得的结果更准确一些
4)题目:输入某年某月某日,判断这一天是这一年的第几天?
这个应该是实际应用中,经常遇到的问题了.
1 <body> 2 年:<input type="number" id="txtYear"/> </br> 3 月:<input type="number" id="txtMonth"/> </br> 4 日:<input type="number" id="txtDay"/> </br> 5 <button onclick="getDayCount()">提交</button> 6 <script> 7 // 输入某年某月某日,判断这一天是这一年的第几天? 8 /** 9 * 一年12个月, 除2月特殊外,有4个小月(4,6,9,11),每个月30天 10 * 7个大月(1,3,5,7,8,10,12)每个月31天 11 * 2月特殊:闰年29天,平年28天; 闰年就是年数能被400整除,或者能被4整除但不能被100整除 12 * 此处不考虑判别输入是否有误,假设用户都是有效输入. 13 */ 14 function getDayCount(){ 15 var year = parseInt(document.getElementById("txtYear").value); 16 var month = parseInt(document.getElementById("txtMonth").value); 17 var day = parseInt(document.getElementById("txtDay").value); 18 19 var isLeapYear = year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);//判断是否闰年 20 var dayList = [0,31]//到1月,2月的总天数 21 var smMonthList = [4,6,9,11];//小月列表 22 for(var i = 2; i < 12; i++){//存储11个月的总天数, 第12个月用不到 23 24 var count = dayList[dayList.length-1]; 25 if(i == 2){ 26 count += (isLeapYear? 29 : 28); 27 }else{ 28 count += 29 smMonthList.indexOf(i) !=-1 ?30 : 31; 30 } 31 dayList.push(count); 32 } 33 console.log(dayList) 34 var dayCount = dayList[month-1] + day; 35 document.writeln("这是这一年的第"+ dayCount +'天') 36 37 } 38 </script> 39 </body>
5)输入三个整数x,y,z,请把这三个数由小到大输出。
思路:
JS的sort方法能够帮助我们简单的解决这个问题,但是还是自己写一遍吧,顺便回忆下早已忘记的冒泡排序
1 //输入三个整数x,y,z,请把这三个数由小到大输出。 2 /** 3 * 1)偷懒解决:用js sort方法可以轻松实现 4 * 2)自己写sort排序方法啦 5 */ 6 //此处复习下如何取n到m之间的随即整数: num = parseInt(Math.random()*(maxM - minN +1))+minN 7 var arr=[]; 8 //取3个1到100的随即整数 9 for(var i =0;i < 3;i++){ 10 arr.push(parseInt(Math.random()*(100-1+1)) + 1) 11 } 12 document.writeln(arr.sort(function(a,b){return a-b})); 13 14 function sort(arr){ 15 for(var i = 0; i<arr.length; i++){ 16 for(var j = 0; j<arr.length; j++){ 17 if(arr[i] < arr[j]){ 18 var temp = arr[j]; 19 arr[j] = arr[i]; 20 arr[i] = temp; 21 } 22 } 23 } 24 return arr; 25 } 26 document.writeln(sort(arr));
6)题目: 用*号输出字母C的图案。
呃.这个,这个就先算了吧.下一题
7)题目: 输出特殊图案,请在c环境中运行,看一看,Very Beautiful!
这个 ,这个也过吧
8)题目: 输出9*9口诀。
这个有点简单,可以扩充输出倒三角之类的,今天太晚就不扩充了
1 for(var i =1; i <= 9;i++){ 2 for(var j = 1; j <=i ;j++){ 3 document.writeln( i +'*'+ j +'=' +i*j ) 4 } 5 document.writeln( '<br>' ) 6 }
9)题目:要求输出国际象棋棋盘
思路:国际象棋盘,8行8列,白黑相间. 我现在只记得PS怎么画这个象棋盘,中毒已深.
C语言是直接输出特殊符号,这里我懒得去查了,直接画一个可以控制颜色的方块,然后控制DOM,用appendChild方法追加到HTML上
1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 <style> 7 *{box-sizing: border-box;margin:0;padding:0;} 8 .container{ 320px;} 9 .container .block{ 10 display: inline-block; 11 40px;height:40px; 12 } 13 .black{ 14 background: black; 15 } 16 .white{ 17 background: white; 18 } 19 </style> 20 </head> 21 <body> 22 <div class="container" id="container"> 23 </div> 24 <script> 25 var container = document.getElementById('container'); 26 for(var i =1; i <= 8;i++){ 27 for(var j = 1; j <=8 ;j++){ 28 var div = document.createElement("div"); 29 if(i%2==0){ 30 div.className = 31 j%2==0? 'white block':'black block'; 32 }else{ 33 34 div.className = 35 j%2==0? 'black block':'white block'; 36 } 37 38 container.appendChild(div) 39 } 40 } 41 </script> 42 </body> 43 </html>
输出结果:
10)打印楼梯,同时在楼梯上方打印两个笑脸。
看到这题我是懵逼的,什么是楼梯,什么样的楼梯. 不得已我只好参考了下别人的,原来是阶梯..........
参考第8题,99乘法表不输出了,数个台阶,上面放两个笑脸. 算了,这题也跳过.
总结:
这几题都比较简单,明天继续
11)古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
这是著名的斐波那契数列,百度下即可知.最常想见的是递归求解.但是大家都知道递归效率不高.
1 //1)递归解法 2 function fit(n){ 3 return n <= 2?1:fit(n-1) + fit(n-2); 4 } 5 console.log(fit(5));
另外是循环求解了
//循环求解 var f1=f2=1; for (var i =1; i <= 20; i ++){ if(i>2){ var temp = f1; f1 = f1+f2; f2 = temp; } document.writeln(f1) } //循环求解 var f1=f2=1; for (var i =1; i <= 20; i ++){ f1 = f1 + f2; f2= f1 + f2; document.writeln(f1 + ' ' +f2) }
12)题目:判断101-200之间有多少个素数,并输出所有素数。
1 var ttl = 0; 2 for(var i = 101; i<=200; i++){ 3 var ceil = Math.ceil(Math.sqrt(i)); 4 for(var j = 2; j <= ceil; j++){ 5 if(i % j == 0){ 6 break; 7 } 8 } 9 if(j == ceil+1){ 10 document.writeln(i); 11 ttl++; 12 } 13 } 14 document.writeln("共有"+ttl+'个素数.');
13)题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数
给出大致范围如1000内,遍历求解
1 for(var i = 100; i < 1000; i++){ 2 var i = i + ''; 3 var a = i.charAt(0); 4 var b = i.charAt(1); 5 var c = i.charAt(2); 6 if(a*a*a + b*b*b + c*c*c == i){ 7 console.log(i); 8 } 9 }
14)将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
注意:这里分解的是质因数,1和整数自身不是质因数
1 var n = parseInt(Math.random()*10000); 2 console.log(n); 3 var arr = []; 4 function getN(n){ 5 var limit = parseInt(Math.sqrt(n+1)); 6 for(var i = 2; i <= limit; i++){ 7 if(n % i == 0){ 8 n /= i; 9 arr.push(i); 10 break; 11 } 12 } 13 if(limit+1 == i){ 14 arr.push(n); 15 console.dir(arr.join('*')); 16 }else{ 17 getN(n); 18 } 19 20 } 21 getN(n);
15)题目15:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
1 var score = parseInt(Math.random()*100); 2 console.log(score); 3 score = score>=90?'A':score<60?'C':'B'; 4 console.log(score);
16)输入两个正整数m和n,求其最大公约数和最小公倍数。
1 /** 2 * 最小公倍数=a*b/最大公约数 3 * 求最大公约数 4 * 最简单的就是碾除法(穷举法和相减法就不写了): 5 * ① a%b得余数c 6 * ② 若c=0,则b即为两数的最大公约数 7 * ③ 若c≠0,则a=b,b=c,再回去执行① 8 */ 9 function fun1(a,b){ 10 while (b!=0){ 11 var c = a % b; 12 a = b; 13 b = c; 14 } 15 return a; 16 }
17)题目17:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
1 function calInput(id){ 2 var value = document.getElementById(id).value; 3 var countSpace = 0;//计算空格 4 var countNum = 0;//数字 5 var countOther = 0;//其它字符 6 var countEng = 0;//英文字母 7 for(var i = 0; i< value.length; i++){ 8 if(value[i]==' '){ 9 countSpace ++; 10 }else if(value[i]>=0 && value[i] <=9){ 11 countNum++; 12 }else if(value[i]>='a' && value[i] <='z'){ 13 countEng++; 14 }else{ 15 countOther++; 16 } 17 } 18 var p = document.getElementById('txt'); 19 p.innerHTML = '空格数:'+countSpace+'个</br>'+'数字:'+countNum+'个</br>'+'英文字母:'+countEng+'个</br>'+'其他字符:'+countOther+'个'; 20 }
18)题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
1 var a = parseInt(Math.random()*10); 2 console.log(a); 3 var n = parseInt(Math.random()*20); 4 n=3; 5 console.log(n); 6 var count = 1; 7 var tn = 0; 8 var sn = 0; 9 while(count<=n) 10 { 11 tn=tn+a; 12 sn=sn+tn; 13 a=a*10; 14 count++; 15 } 16 console.log(sn)
19)一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。
1 function getN(n){ 2 var arr = [] 3 for(var i = 1; i < n; i++){ 4 if(n % i == 0){ 5 arr.push(i); 6 } 7 } 8 return arr; 9 } 10 for(var i = 2;i < 10000; i++){ 11 var arr = getN(i); 12 if( eval(arr.join('+')) == i){ 13 console.log(i) 14 } 15 }
20)一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
1 var dis = 100;//第一次落地经过的米数 2 var height = 100;//第一次反弹前的高度 3 var n = 2; 4 while(n<=4 && n>1){ 5 height = height/2; 6 dis += height * 2; 7 n++ 8 } 9 console.log(dis); 10 console.log(height)