let res = 0 // for 循环的 循环增值 i++ 会在函数执行完成后开始 // 所以从 1 开始就应该在初始化i的时候直接 let i = 1 for (let i = 1; i <= 21; i++) { // 余数 0 的数 = 能被 7 整除的数 if (i % 7) res += i } console.log(res)
循环数除了 for 也可以用 while。
1 2 3 4 5 6 7
let res = 0 let index = 1 while (index <= 21) { if (index % 7) res += index index++ } console.log(res)
数的循环的各种方法在此仅叙述一次,个人感觉还是 for 循环数比较清晰,后续都会直接用 for 循环了。
同时在这里再赘述一下 for 循环,我感觉对 for 循环的执行流程这样的解释是更加容易理解和接受的。
for (let i = 1998; i <= 2008; i++) { // 条件:能被 4 整除,但不能被 100 整除(普通闰年) 或 能被 400 整除(世纪闰年)。 // 写法一: if ((!(i % 4) && i % 100) || !(i % 400)) console.log("闰年", i) // 写法二: if ((i % 4 === 0 && i % 100 !== 0) || i % 400 === 0) console.log("闰年", i) }
求乘积等于100的所有乘数和被乘数(正负整数)
1 2 3 4 5 6 7 8 9 10 11
// 求乘积等于100的所有乘数和被乘数(正负整数) let pairs = [] for (let i = 1; i * i <= 100; i++) { // 找到 100 除以 i 没有余数的,即 i 是 100 的因子 if (100 % i === 0) { let a = i let b = 100 / i pairs.push([a, b], [-a, -b]) } } console.log(pairs)
倒序遍历输出数组
1 2 3 4 5 6
const list = [1, 2, 3, 4, 5] const reverseList = [] for (let i = list.length - 1; i >= 0; i--) { reverseList.push(list[i]) } console.log(reverseList)
当然,list 本身就是有 reverse 方法的,根据 V8 引擎的 Array.prototype.reverse C++ 源代码,这里写一个等效的函数。
1 2 3 4 5 6 7 8 9 10 11 12
// V8 JavaScript 引擎实现的 Array.prototype.reverse(简化版) voidArrayReverse(TQArray arr){ int left = 0; int right = arr.length - 1; while (left < right) { // 交换 arr[left] 和 arr[right] std::swap(arr[left], arr[right]); left++; right--; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14
Array.prototype.myReverse = function () { let left = 0 let right = this.length - 1 while (left < right) { // 交换 this[left] 和 this[right] ;[this[left], this[right]] = [this[right], this[left]] left++ right-- } returnthis// 返回结果会直接修改原数组 }
const num = 7 const result = true // 由于素数是一定能被1和它本身整除,所以需要避免出现这两个值 for (let i = 2; i < num; i++) { // 取模语法:被除数 % 除数(顺序同除法/) if (!(num % i)) result = false } console.log(result)
判断水仙花数
说明:水仙花数(Narcissistic Number)是指一个 n 位数,其各位数字的 n 次方和等于它本身的数。
例子:153=1^3^+5^3^+3^3^
1 2 3 4 5 6 7 8 9 10 11 12
const num = 153 let sum = 0 const str = num.toString() for (const number of str) { // 使用 pow 计算 n 次方 sum += Math.pow(Number(number), str.length) } if (sum === num) { console.log(num, "是水仙花数") } else { console.log(num, "不是水仙花数") }
// 循环遍历三个值能乘以的最大的数 for (let i = 0; i <= targetNum / numList[0]; i++) { for (let o = 0; o <= targetNum / numList[1]; o++) { for (let u = 0; u <= targetNum / numList[2]; u++) { // 筛选满足条件的组合并记录 if (i * numList[0] + o * numList[1] + u * numList[2] === targetNum) { allCombos.push([i, o, u]) } } } }