C语言编程100例JavaScript版(0~20)

尝记还是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,求应发放奖金总数? 

 

 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>
View Code

 3)题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 

思考:

完全平方数是啥??? 我也不知道,百度百科解释:"完全平方即用一个整数乘以自己例如1*1,2*2,3*3等,依此类推。若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。完全平方数是非负数,而一个完全平方数的项有两个。注意不要与完全平方式所混淆。"

这题有两个解法, 我想出的是根据公式枚举出这两个完全平方数,然后倒推出这个整数,思路如下:

 

 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     }
View Code

 

另一个是顺推枚举, 先限定这个整数的范围,然后根据条件直接找出这个整数

 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     }
View Code

下面是输出的结果,可以看到第一个结果比第二个多了一个解: -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{width: 320px;}
 9         .container .block{
10             display: inline-block;
11             width: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)

 

posted @ 2017-07-27 15:48  阿拉kiyo  Views(808)  Comments(0Edit  收藏  举报