循环逻辑练习
辗转相除法求最大公约数
问题:定义两个变量,求两个数的最大公约数。
辗转相除法:辗转相除法,又称欧几里得算法(Euclidean algorithm),是求取最大公约数的一种算法。
基于核心原理:两个数的最大公约数等于其中较小的数字和二者之间余数的最大公约数
分析:较大值/较小值…余数 较小值/余数…余数 循环,直到余数为0,此时的除数为最大公约数
如:
10和25
1.28/10=2…8(余8)
2.10/8=1…2(余2)
3.8/2=4…0(余0)
此时,最大公约数为2
num1 = Math.floor(Math.random() * 21 + 10);
num2 = Math.floor(Math.random() * 21 + 10);
var max = num1 > num2 ? num1 : num2;
var min = num1 + num2 - max;
while (max % min != 0) {
var temp = max % min; // 接收余数
max = min;
min = temp;
}
document.write(num1 + "和" + num2 + "公约数为" +min);
完数
一个数如果恰等于它的因子之和,这个数被称之为完数,比如6=1+2+3,求出1000以内所有的完数
分析:每个数从1开始一直除到其自身数值减一,记录可以整除因子,并将其相加,再将相加后的值与自身值比较,若相同则为完数
for (var i = 1; i <= 1000; i++) {
var sum = 0; //记录因子之和
for (var j = 1; j < i; j++) {
if (i % j == 0) {
sum += j;
}
}
if (sum == i) {
document.write(i + "是完数");
}
}
猴子吃桃问题
问题:猴子第一天摘了若干个桃子,当即吃了一半,还不过瘾又多吃了一个。第二天早上又吃了剩下桃子的一半,之后又多吃了一个。以后每天早上都是一样。到第十天时发现只剩一个桃子,问猴子第一天一共摘了多少个桃子?
分析:
第十天:1个
第九天:(1+1)*2=4个
第八天:(4+1)*2=10个
…
第一天:?
第十天桃子数为1,每前一天桃子数为该天桃子数+1后再乘2:
var b = 1;
for (var i = 9; i > 0; i--) {
b = (b + 1) * 2;
}
document.write("第一天桃子数为:"+b);
或倒推,假设第一天一个,求第十天桃子数,则每一天的桃子数为前一天桃子数+1后的值再乘2:
var a = 1; //剩余数量
for (var i = 1; i <= 9; i++) {
a = (a + 1) * 2;
}
document.write("第一天桃子数为:"+a);
兔子生兔子问题
问题:有一对幼兔,幼兔一个月后长成小兔,小兔一个月后长成成兔并生下一对幼兔,问8个月后有多少对兔子,成兔、幼兔、小兔的对数分别是多少?
分析:
假设幼兔为a,小兔为b,成兔为c
第一天:a=1,b=0,c=0
第二天:a=0,b=1,c=0
第三天:a=1,b=0,c=1
第四天:a=1,b=1,c=1
…
可得:
幼兔数量=上月小兔数量+上月成兔数量
小兔数量=上月幼兔数量
成兔数量=上月成兔数量+上月小兔数量
var n1 = 1, //幼兔
n2 = 0, //小兔
n3 = 0; //成兔
for (var i = 2; i <= 8; i++) {
var yt = n2 + n3; //幼兔
var xt = n1; //小兔
var ct = n3 + n2; //成兔
n1 = yt;
n2 = xt;
n3 = ct;
}
document.write(n1 + "对幼兔;" + n2 + "对小兔;" + n3 + "对成兔");
补充
斐波那契数列:
指的是这样一个数列:1、1、2、3、5、8、13、21、34、…
规律:数列从第三项开始,每一项等于前两项之和。
递归算法:
var n1 = 1,//第一天总量
n2 = 1,//第二天总量
n3 = 0;//假设第三天数量为0
for (var i = 3; i <= 8; i++) {
n3 = n1+n2;
n1 = n2;
n2 = n3;
}
document.write("第八个月兔子总数为:" + n3);