算法题目集
来源:互联网 发布: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;
}
}
- 算法题目集
- 算法题目
- 算法题目
- 算法题目
- 算法题目
- 算法题目
- 几个算法题目
- 一道算法题目,值得一看
- 算法题目收集
- 几个算法题目
- 转贴]一些算法题目
- 几个算法题目
- C++算法题目
- 算法题目汇集
- 一些经典算法题目
- ACM 算法题目解
- 一道算法题目
- Java面试算法题目
- 2017.11.22心得
- 使用SAS实现单因素方差分析
- DbContextHelper.cs
- 分布式服务框架 Zookeeper
- oracle 查看 用户,用户权限,用户表空间,用户默认表空间
- 算法题目集
- 【Scikit-Learn 中文文档】最近邻
- 图片转换为batch批数据(25)---《深度学习》
- mybatis更新文章阅读次数
- Glide系列之四:玩转Glide的回调与监听
- C++|继承
- 学习笔记3
- 助你快速踏入高薪职场——2017面试集锦之WebService
- Noip2017挂惨记暨规划