Open Lichen5221 opened 3 years ago
自己試寫:
function sqr(n) {
let sum = 0
for (var i = 1; i <= n; i++) {
if (i % Math.sqrt(i) === 0) {
sum += i
}
}
return sum
}
console.log(sqr(30))
哀, LIOJ 又不能執行我寫的東西了,真煩。
還以為跟是否能驗證整數有關,無聊又寫了一個:
let sum = 0
for (var i = 1; i <= num; i++) {
n = Math.sqrt(i)
if (n % 1 === 0) {
sum += i
}
}
return sum
node.js 完美執行,可是在 LIOJ 上還是不能執行哇~
老師解答:
let n = Number(lines[0])
let sum = 0
for(let i = 1; i <= n; i++) {
if (isSquare(i)) {
sum += i
}
}
console.log(sum)
function isSquare(n) {
let r = Math.floor(Math.sqrt(n))
return r*r === n
}
差異:我是直接可整除即為平方和,為什麼要用無條件捨去,然後再判斷相乘是否相同⋯⋯好煩啊。
結果丟老師的上去才發現自己少了個 v ,補上去之後放上我的答案,結果是錯誤的答案欸,為什麼啊?明明 node.js 就能完美執行啊!
然後呢,又發現是要 console.log ,而不是 return 欸,到底想怎樣啊?結論就是要印出答案要用 console.log 喔。
自己試寫:
function code(n, str) {
let s = ''
for (var i = 0; i < str.length; i++) {
let ASCII = str.charCodeAt(i) + n
if (ASCII > 122) {
let nc = ASCII - 26
console.log(nc)
s += String.fromCharCode(nc)
} else {
console.log(ASCII)
s += String.fromCharCode(ASCII)
}
}
console.log(s)
}
code(10, 'xray')
LIOJ 版本:
let n = Number(lines[0])
let str = lines[1]
let s = ''
for (var i = 0; i < str.length; i++) {
let ASCII = str.charCodeAt(i) + n
if (ASCII > 122) {
let nc = ASCII - 26
s += String.fromCharCode(nc)
} else {
s += String.fromCharCode(ASCII)
}
}
console.log(s)
真心不解錯在哪裡⋯⋯明明 node 上執行好好的⋯⋯
老師解答:
let n = Number(lines[0])
let str = lines[1]
let result = ''
for (let i = 0; i < str.length; i++) {
result += ceaserCipher(n, str[i])
}
console.log(result)
function ceaserCipher(n, s) {
let code = s.charCodeAt(0) - 97
let newCode = (code + n) % 26
return String.fromCharCode(newCode + 97)
}
差異:老師還把數字變 0 再去處理,這樣不是多此一舉嗎⋯⋯為什麼一定要這樣也沒有說⋯⋯
我自己看著程式想了很久,理解到為什麼不能用減,因為 n 會大到 100 ,當 100 的時候根本不能只減一次 26,讓我好好想想有沒有可能利用之前的不斷減 26 直到數字小於 122 這個迴圈。
有空再回來改看看吧。
// LIOJ 1036:Array reverse function reverse(arr) { }
// LIOJ 1037:Array filter // 這題 callback 會是一個 function,但難度會比較高 // 若是做不出來,也可以調整參數 function filter(arr, callback) { }
// LIOJ 1038:Array indexOf function indexOf(arr, searchElement) { }
// LIOJ 1039:Array fill function fill(arr, value) { }
// LIOJ 1040:Array join function join(arr, separator) { }
// LIOJ 1041:String trim function trim(str) { }
// LIOJ 1042:String toLowerCase function toLowerCase(str) { }
// LIOJ 1043:String endsWith function endsWith(str, searchString) { }
// LIOJ 1044:String padEnd function padEnd(str, targetLength, padString) { }
// LIOJ 1045:String slice function slice(str, beginIndex, endIndex) { }
如果沒有模組:將東西全部放在一起(例如:登入、金流、會員管理、權限管理⋯⋯),容易改到其他的部分,難以管理。
如果有模組:可以將所有東西切割開來,用一個主程式將東西全部串接起來。這樣即便是修改其他的系統,也不會去影響另一個系統。
node.js 本身就提供一些模組,參考 此頁。
var os = require('os') //因為 os 是 node.js 直接的模組(中國:模塊),不用加什麼東西,透過 require 可引入。
os.platform( ) 回傳你所用的作業系統
require 是要引入的模組,利用變數宣告(變數愛取什麼就取什麼),可以使用他人寫好的模組。
建立東西給別人用:
function double(n) {
return n * 2
}
module.export = double
非系統提供借用:
var myModule = require('./myModule.js') //不打 .js 也可以
console.log(myModule)
以物件的方式輸出多樣:
var obj = {
double: double,
triple: function( ) {
return n * 3
}
}
module.exports = obj
// 引入:
var myModule = require('./myModule')
console.log(myModule.double(2), myModule.triple(10))
第二種方法:
exports.double = double //引入結果絕對是物件
exports.triple = function (n) {
return n * 3
}
為什麼需要模組?當兩個檔案需要相同的驗證方式或是相關函式時,不必用複製貼上,也不必更改時兩個都要更改(如果用在十個檔案上就要更改十個?),這樣太沒效率也很不方便,故寫好一個模組後,將模組引入這些檔案裡即可。
內建函式做做看
練習實作內建函式
理解內建函式,較能理解並使用。
實戰:Array.map
老師解答:
實戰:String.repeat
老師解答:
實戰:Array.lastIndexOf
老師解答: