- 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。
算法就是把一个问题,拆解为计算机能够一步一步执行的步骤。
计算机的流程控制语句:顺序执行、选择语句、循环语句。
优秀算法的要求
- 正确性
- 健壮性
- 可读性
伪代码
- 计算1+2+3+……+99+100的和。
累加器题目
- 由用户输入数字n,请计算下面算式的值。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 由用户输入数字n,计算3/2 + 4/3 + 5/4 + …… + (n+1)/n的结果
// 用户输入数字n
var n = Number(prompt('请输入数字n'));
// 累加器
var sum = 0;
// 遍历分母就可以了,因为分子就是分母加1
for (var i = 2; i <= n; i++) {
sum += (i + 1) / i;
}
alert(sum.toFixed(2));
</script>
</body>
</html>
累乘器题目
- 由用户输入数字n,请计算n的阶乘。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 计算阶乘
// 请用户输入数字n
var n = Number(prompt('请输入数字'));
// 累乘器,一定注意,累乘器要从1开始,因为如果从0开始,0乘以任何数字都是0,
var result = 1;
// 倒着遍历,计算阶乘
for (var i = n; i >= 1; i--) {
result *= i;
}
// 显示结果
alert(result);
</script>
</body>
</html>
同时用到累加器和累乘器的题目
- 圆周率π可以由下面的莱布尼茨级数公式计算出来,请由用户输入参数n,计算圆周率π。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 用莱布尼茨级数估算圆周率
// π = 2 * (1 + 1/3 + (1*2)/(3*5) + (1*2*3)/(3*5*7) + (1*2*3*4)/(3*5*7*9) + (1*……n)/(3*5*……2n+1))
// 累加器,就是最后的答案,
var sum = 0;
// 累乘器,用来制作每一项,制作出来的这个项,要往累加器中累加
var item = 1;
// 让用户输入n
var n = Number(prompt('请输入数字n'));
// 遍历
for (var i = 1; i <= n; i++) {
// 要先制作出这一项,这一项怎么制作?要使用累乘器。item就是小车厢。
item *= i / (2 * i + 1);
// console.log(item);
// 把车厢往累加器中累加
sum += item;
}
// 显示结果
alert((1 + sum) * 2);
</script>
</body>
</html>
穷举法
- 穷举法,顾名思义,是指根据题目的条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况符合题目的条件,则为本问题的一个解;若全部情况验证后都不符合题目的条件,则本题无解。
- 编程寻找100以内的既能被3整除,也能被5整除的数字。
- 计算机穷举方法:
穷举法题目
- 寻找全部的水仙花数。水仙花数是这样的一个3位数:它的每个数位的数字的立方和等于它本身。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 寻找水仙花数
for (var i = 100; i < 1000; i++) {
// 水仙花数要拆数位
// a、b、c分别表示百位、十位、个位
var i_str = i.toString();
var a = i_str.charAt(0);
var b = i_str.charAt(1);
var c = i_str.charAt(2);
if(Math.pow(a, 3) + Math.pow(b, 3) + Math.pow(c, 3) == i) {
console.log(i);
}
}
</script>
</body>
</html>
循环嵌套题目
- 请寻找1~100的所有质数。
- 质数:只能够被1和它本身整除的数字,最小的质数是2。
- 比如:2、3、5、7、11、13、17、19、23、29……
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 寻找100以内的质数
// 穷举法
outer: for (var i = 2; i <= 100; i++) {
// 内层循环开始从2开始到小于这个数字的每一个数字都尝试除i,如果能够整除,说明它不是质数,就可以筛选下一个数字了
for (var j = 2; j < i; j++) {
if (i % j == 0) {
// 说明数字i不是质数,因为它找到了除1和它自身之外的约数了,测试下一个数字了
// continue表示放弃这个数字,开始迭代下个数字,continue它负责的是它所在的最内层的for循环
// 要给外层for循环加上label,然后在continue的后面加上这个label,
// 这样就表示立即开始迭代外层for循环的下一个数字了,而不是内层for循环
continue outer;
}
}
// 能够遇见这条语句的数字i,一定是质数,否则就被continue略过了
console.log(i);
}
</script>
</body>
</html>
- 有鸡兔同笼,上有三十五头,下有九十四足,问鸡兔各几何。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 鸡兔同笼的问题
// 方法1:
// // 假设小鸡有a只,兔子有b只
// for (var a = 0; a <= 35; a++) {
// for (var b = 0; b <= 35; b++) {
// if (a + b == 35 && 2 * a + 4 * b == 94) {
// console.log('小鸡有' + a + '只,兔子有' + b + '只');
// }
// }
// }
// 方法2:
// 假设小鸡有a只,那么兔子有35 - a只
for (var a = 0; a < 35; a++) {
var b = 35 - a;
if (2 * a + 4 * b == 94) {
console.log('小鸡有' + a + '只,兔子有' + b + '只');
}
}
</script>
</body>
</html>