zoukankan      html  css  js  c++  java
  • 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{ 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)
  • 相关阅读:
    Unity 历史版本的安装
    jQuery使用记录
    tkinter 按钮响应函数传值
    python网络爬虫入门(二)
    python 爬取豆瓣书籍信息
    python 爬取猫眼电影top100数据
    SpringMVC+SpringBoot+MyBatis
    时间日期类
    Mybatis框架(三)
    Java框架之MyBatis框架(二)
  • 原文地址:https://www.cnblogs.com/kiyo/p/7245253.html
Copyright © 2011-2022 走看看