算法题目集

来源:互联网 发布:plc显示屏编程软件 编辑:程序博客网 时间:2024/06/06 11:36

累加

第一个:小球从100米高空落下,每次都会跳到原来的一半高度,问20次落地时小球走过的距离。

var sum=0;
var arr=[i];
arr[0]=100;
for(var i=0;i<20;i++){
    var sum=sum+arr[i]*2;
    arr[i+1]=arr[i]/2;
}
var res=sum-arr[0];
document.write(res);

 

计算斐波那契数列(1/2 2/3 3/5 5/6…….)的前20 项之和。

var arr=[];
arr[0]=1;arr[1]=2;
var sum=0;
for(var i=0;i<=20;i++ ){
    sum=sum+(arr[i]/arr[i+1]);
    arr[i+2]=arr[i+1]+arr[i];
}
document.write(sum);

 

累加/乘算法的一般形式:

V += e

V *=e

算法要点:

(1)初始化

v =0; 累加

v =1; 累乘

E的每一项的初始化,可能会比较复杂,小球的初始化就是一个高度,数列分为分子和分母。圆周率的还有符号

(2)循环控制的条件

从题目中去获取,可能是固定的循环次数,也可能是项数的要求,具体情况具体分析

(3)从当前项如何变为下一项

数列的,当前的分母变为下一项的分子,当前的分子加分母变为下一项的分母。

 

迭代法

求两个数的最大公约数

辗转相除法

用较大的数对较小的数取余数,如果余数为0,那么最大公约数就是这个较小的数,如果不为0,那么让除数变为较大的数,余数变为较小的数,继续这样下去直到余数为0

var num1=Number(prompt("请输入一个数"));
var num2=Number(prompt("请输入一个数"));
var res=maxGCD(num1,num2);
alert(res);
//函数的功能:得到两个数的最大公约数
//
名称:maxGCD
//
参数:num1num2
//
返回值:最大公约数
function maxGCD(x,y){
    var max=Math.max(x,y);
    var min=Math.min(x,y);
    while(max%min!=0){
        var temp=max%min;
        max=min;
        min=temp;

    }return min;
}

这个就叫迭代法,也叫辗转法。

规律:不断地用旧的值去代替新的值,直到得到想要的结果

套路:

(1)    找到迭代的变量(旧的值)除数和余数

(2)    确定迭代的关系  直接赋值

(3)    迭代的条件  余数不等于0


递推

兔子产子问题:

一般而言:兔子在出生2个月后就能生崽

一对兔子每个能生出一对兔子

最开始有一对刚出生兔子

假设所有的兔子都不死,问一年后有多少兔子

var rabbit=[1,1];
for(var i=2;i<12;i++){
    rabbit[i]=rabbit[i-1]+rabbit[i-2];
alert(rabbit[11]);//结果为144

对于递推,最重要的是找到数学公式,从当前项或当前几项推出下一项

 

猴子摘桃:一只猴子,第一天摘了若干个桃子当即吃了一半不过瘾又多吃了1个,第二天又吃掉剩下的一半,又多吃了2个,第三天还是吃掉一半又多吃了3个,到了第n天发现只剩下一个桃子。请问:第一天摘了多少桃子?

n天数由用户输入

假设第七天剩下一个桃子

第几天

7

6

5

 

桃子的个数

1

x/2-6=1

x/2-5=14

 

 

 

14

38

 

桃子个数=(今天是第几天+后一天桃子个数)*2

var day=Number(prompt("请用户输入天数"));
 var sum=1;
 for(var i=day-1;i>0;i--){
     sum=(sum+i)*2;
 }alert(sum);

 

关于存钱问题:一个土豪,给他儿子的四年大学生活活期存了一笔钱,富二代每个月只能去3000作为下一个月的生活费,年利率是1.71%,富豪一次性要存多少钱。

48个月: 3000

47个月:3000=(x-3000)*(1+0.0171/12)  x=

var money=3000;
for(var month=47;month>0;month--){
     money=money/(1+0.0171/12)+3000;
}
alert(money);

 

穷举法

百块钱买白只鸡问题

100元钱如何买100只鸡

鸡翁一值钱5,鸡母一值3,鸡雏3值钱1

公鸡 最多20只

母鸡 最多33只

小鸡 最多300只

for(var cock=0;cock<20;cock++){
    for(var hen=0;hen<33;hen++){
        for(chicken=0;chicken<300;chicken++)
        {
            if(cock+hen+chicken==100&&cock*5+hen*3+chicken/3==100){
                document.write("公鸡:"+cock+"母鸡:"+hen+"小鸡:"+chicken);
            }
        }
    }
}
for(var cock=0;cock<20;cock++){
    for(var hen=0;hen<33;hen++){
    var chicken=100-cock-hen;
        if(cock*5+hen*3+chicken/3==100){
            document.write("公鸡:"+cock+"母鸡:"+hen+"小鸡:"+chicken);
        }
    }
}

      穷举法:一般代码简单,算法也简单,但是计算量会很大,尤其没有经过人为的过滤,但是计算机的优势就是运算速度快,所以这个算法扬长避短。可以得到很好的效果。虽然计算机的计算速度很快但是也有一定的局限,所以有时候需要我们认为去优化算法,减少计算的次数

      

       案例:有一个三位数,个位数字比百位数字大,而百位数字比十位数字大,并且各位数字之和等于各位数字相乘之积,求这个三位数

for(var i=2;i<10;i++){
    for(var j=0;j<10;j++){
        for(var k=1;k<10;k++){
            if((i>k&&k>j)&&(i+j+k==i*j*k)){
                var num=i+j*10+k*100;
                document.write(num);
            }
        }
    }
}//结果为213

 

作业:蜘蛛有8条腿,蜻蜓有6条腿和2对翅膀,蝉有6条腿和一对翅膀,三种虫子一共有18只,共有116条腿和20对翅膀,问每种虫子各有多少只?

for(var i=0;i<14;i++){
    for(var j=0;j<10;j++){
        for(var k=0;k<20;k++){
        if((i+j+k==18)&&(8*i+6*j+6*k==116)&&(2*j+k==20)){
              alert("蜘蛛为:"+i+"</br>"+"蜻蜓为:"+j+"</br>"+"蝉为:"+k);
            }
        }
    }
}

 

递归

什么叫递归?函数内部调用本身

求阶乘问题

function fact(n){
    if(1==n){
        return1;
    }
    return n*fact(n-1);
}

 

递归算法如果按照常规思路去理解,非常复杂,函数调用的嵌套一层套一层。然后一层一层返回。

       使用递归的条件:必须要有一个已知的结果

       递归实际上是一个降阶的问题,将n阶问题转化为n-1 阶的问题,也就是去找n 和n-1 的关系。

var num=Number(prompt("请输入一个数阶乘"));
function fact(n){
    if(1==n){
        return1;
    }
    return n*fact(n-1);
alert(fact(num));

 

猴子选大王

一圈猴子,选大王报数,报的数为3就退出,直到剩下最后一只猴子当选为大王。

var num=Number(prompt("请输入猴子个数"));
var king=selectKing(num);
alert(king);
 function selectKing(n){
     if(1==n){
         return0;
     }else{
       return(selectKing(n-1)+3)%n;
     }
 }


原创粉丝点击