js之基础算法案例
1 判断是闰年还是平年
算法:能被4整除且不能整除100的为闰年 或者能够被 400 整除的是闰年
// 接收用户输入
var year = prompt('请您输入年份:');
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
alert('您输入的年份是闰年');
} else {
alert('您输入的年份是平年');
}
2 一行打印5个 *
var str = '';
for (var m = 0; m < 5; m++) {
str += '★';
}
console.log(str);
// 输出: ★★★★★
3 打印五行五列星星
var str = '';
for (var m = 0; m < 5; m++) {
// 外层循环负责打印五行
for (var n = 0; n < 5; n++) {
// 内层循环负责一行打印五个星星
str += '★';
}
str += '\n'; // 每次满 5个星星 就 加一次换行
}
console.log(str);
/*
★★★★★
★★★★★
★★★★★
★★★★★
★★★★★
*/
4 打印倒三角形
var str = '';
for (var m = 1; m <= 10; m++) {
for (var n = m; n <= 10; n++) {
str += '★';
}
str += '\n'; // 换行
}
console.log(str);
/*
★★★★★★★★★★
★★★★★★★★★
★★★★★★★★
★★★★★★★
★★★★★★
★★★★★
★★★★
★★★
★★
★
*/
5 打印正三角形
var str = '';
for (var m = 1; m <= 10; m++) {
for (var n = 1; n <= m; n++) {
str += '★';
}
str += '\n'; // 换行
}
console.log(str);
/*
★
★★
★★★
★★★★
★★★★★
★★★★★★
★★★★★★★
★★★★★★★★
★★★★★★★★★
★★★★★★★★★★
*/
6 打印 九九乘法表
/*
一共有9行,但是每行的个数不一样,因此需要用到双重 for 循环
外层的 for 循环控制行数 i ,循环9次 ,可以打印 9 行
内层的 for 循环控制每行公式 j
核心算法:每一行 公式的个数正好和行数一致, j <= i;
每行打印完毕,都需要重新换一行
*/
var str = '';
for (var i = 1; i <= 9; i++) {
for (var j = 1; j <= i; j++) {
str += '' + j + ' × ' + i + '= ' + i * j + '' + '\t';
}
str += '\n'; // 换行
}
console.log(str);
/*
1 × 1= 1
1 × 2= 2 2 × 2= 4
1 × 3= 3 2 × 3= 6 3 × 3= 9
1 × 4= 4 2 × 4= 8 3 × 4= 12 4 × 4= 16
1 × 5= 5 2 × 5= 10 3 × 5= 15 4 × 5= 20 5 × 5= 25
1 × 6= 6 2 × 6= 12 3 × 6= 18 4 × 6= 24 5 × 6= 30 6 × 6= 36
1 × 7= 7 2 × 7= 14 3 × 7= 21 4 × 7= 28 5 × 7= 35 6 × 7= 42 7 × 7= 49
1 × 8= 8 2 × 8= 16 3 × 8= 24 4 × 8= 32 5 × 8= 40 6 × 8= 48 7 × 8= 56 8 × 8= 64
1 × 9= 9 2 × 9= 18 3 × 9= 27 4 × 9= 36 5 × 9= 45 6 × 9= 54 7 × 9= 63 8 × 9= 72 9 × 9= 81
*/
7 翻转数组
// 将数组 ['red', 'green', 'blue', 'pink', 'purple'] 的内容反过来存放
var arr = ['red', 'green', 'blue', 'pink', 'purple'];
var newArr = []; // 新的数组,用来存放翻转后的元素
for (var i = arr.length - 1; i >= 0; i--) {
// 采用循环递减的方式
newArr[newArr.length] = arr[i];
}
console.log(newArr); // 返回:['purple', 'pink', 'blue', 'green', 'red']
8 冒泡排序
// 冒泡排序:从小到大
var arr = [4, 1, 2, 3, 5];
for (var i = 0; i < arr.length - 1; i++) {
// 外层循环管趟数
for (var j = 0; j < arr.length - i - 1; j++) {
// 里面的循环管 每一趟的交换次数
// 内部交换2个变量的值 前一个和后面一个数组元素相比较
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
console.log(arr)
9 水仙花数
水仙花数:是指一个3位数,他的每个位上的数字的3次幂之和等于他本身(例如13+53+3^3=153)
for (var n = 100; n < 1000; n++) {
//将3位数分别拆分:百位、十位、个位
//方法一
var bai = parseInt(n / 100);
var shi = parseInt(n % 100 / 10);
var ge = parseInt(n % 100 % 10);
//方法二
var bai = parseInt(n / 100);
var shi = parseInt((n - bai * 100) / 10);
var ge = parseInt((n - bai * 100 - shi * 10) / 1);
//方法三
var bai = +String(n).substring(0, 1);
var shi = +String(n).substring(1, 2);
var ge = +String(n).substring(2, 3);
if (bai * bai * bai + shi * shi * shi + ge * ge * ge == n) {
console.log(n); //返回 153 370 371 407
}
s
}
10 判断一个数是否是质数
只能被1和它自身整除的数,1既不是质数也不是合数,质数必须是大于1的自然数
var num = prompt('请输入一个大于1的自然数');
//中间变量:表示是否是质数
var flag = true;
for (var i = 2; i < num; i++) {
if (num % i == 0) {
//如果num能被i整除,那么num一定不是质数
flag = false;
break; //直接跳出for循环
}
}
if (flag) {
alert('是质数');
} else {
alert('不是质数')
}
11 打印出1-100之间所有的质数
1既不是质数也不是合数
for (var m = 2; m <= 100; m++) {
var flag = true;
for (var n = 2; n < m; n++) {
//如果m能被n整除,那么m一定不是质数
if (m % n == 0) {
flag = false;
break;
}
}
if (flag) {
console.log(m);
}
}
12 checkbox选中与不选中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
padding: 0;
margin: 0;
}
.wrap {
width: 300px;
margin: 100px auto 0;
}
table {
border-collapse: collapse;
border-spacing: 0;
border: 1px solid #c0c0c0;
width: 300px;
}
th,
td {
border: 1px solid #d0d0d0;
color: #404060;
padding: 10px;
}
th {
background-color: #09c;
font: bold 16px "微软雅黑";
color: #fff;
}
td {
font: 14px "微软雅黑";
}
tbody tr {
background-color: #f0f0f0;
}
tbody tr:hover {
cursor: pointer;
background-color: #fafafa;
}
</style>
</head>
<body>
<div class="wrap">
<table>
<thead>
<tr>
<th>
<input type="checkbox" id="j_cbAll" />
</th>
<th>商品</th>
<th>价钱</th>
</tr>
</thead>
<tbody id="j_tb">
<tr>
<td>
<input type="checkbox" />
</td>
<td>iPhone8</td>
<td>8000</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>iPad Pro</td>
<td>5000</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>iPad Air</td>
<td>2000</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>Apple Watch</td>
<td>2000</td>
</tr>
</tbody>
</table>
</div>
<script>
// 全选按钮
var j_cbAll = document.querySelector('#j_cbAll');
// tbody元素
var tbody = document.querySelector('#j_tb');
// input 单选框元素
var inputs = tbody.querySelectorAll('input');
// 全选和选不选操作事件
j_cbAll.onclick = function () {
for (var i = 0; i < inputs.length; i++) {
inputs[i].checked = this.checked;
}
}
// inputs 选中与不选中
var flag = true;
for (var i = 0; i < inputs.length; i++) {
inputs[i].onclick = function () {
for (var i = 0; i < inputs.length; i++) {
if (!this.checked) {
flag = false;
// 退出for循环 这样可以提高执行效率 因为只要有一个没有选中,剩下的就无需循环判断了
break;
}
}
};
}
if (flag) {
j_cbAll.checked = true;
}
</script>
</body>
</html>
13 求 n 的阶乘
// 求 n 的阶乘 n*(n-1)*(n-2)* .... *3*2*1
function fn(n) {
if (n == 1) {
return 1;
}
return n * fn(n - 1);
}
console.log(fn(3)) // 返回:3*2*1=6
console.log(fn(5)) // 返回:5*4*3*2*1=120
14 求斐波那契数列
利用递归函数求斐波那契数列: 1、1、2、3、5、8、13、21...
// 求第 n 个数的斐波那契数列
// 1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)在现代物理
function fb(n) {
if (n === 1 || n === 2) {
return 1;
}
return fb(n - 1) + fb(n - 2);
}
console.log(fb(3)); // 返回:2
console.log(fb(6)); // 返回:8