# U4.8 Project 4 ###### tags: `ALG 101` `JavaScript` `2020七月第四週` `進度筆記` `Lidemy心得` `7/21` --- [LIOJ 1023:印出聖誕樹](https://oj.lidemy.com/problem/1023) 找規律,類似金字塔。 ``` let n = Number(lines[0]) // 或是改掉這行 let n = Number(3) ; for(let i=1; i<=n; i++) { // 一共 n 層; printTree(i, n) } for(let i=1; i<=n-1; i++) { printBottom(n) } } // 這裡可以直接加solve(['4']),讓檔案印出四層樹,輸入少的時候適合; function printTree(i, n) { // 把 i, n 傳進去; console.log( repeat(' ', n - i) + // 樹前面的空隙; repeat('*', 2*i - 1) // 印出星星; ) } function printBottom(n) { // 造出棍子 , n-1層,每個樹幹都一樣,不用傳 i ; console.log(repeat(' ', n - 1) + '|') // 空白加上樹幹 '|' ; } function repeat(str, n) { let result = '' for(let i=1; i<=n; i++) { result += str } return result } ``` [LIOJ 1024:NN 乘法表](https://oj.lidemy.com/problem/1024) 擴展到 n*m , 考驗抽象化能力。 ``` var readline = require('readline'); var rl = readline.createInterface({ input: process.stdin }); var lines = [] rl.on('line', function (line) { lines.push(line) }); rl.on('close', function() { solve(lines) }) // 拿到所有資料 function solve(lines) { let N = Number(lines[0]) let M = Number(lines[1]) for(let x=1; x<=N; x++) { // 這是外圈,產生外面 1~9 ; for (let i=1; i<=M; i++) { //產生裡面 *1~*9 ; console.log(x+ '*'+ i + '=' +x*i) // 印出 1*1 ~ 1*9 = x*i 結果; // ES6 語法 console.log(`${x}*${i}=${x*i}`) ; } } } // solve(['2', '3']) ``` [LIOJ 1025:水仙花數](https://oj.lidemy.com/problem/1025) 輸出範圍 n 到 m 數字,知道幾位數,切出來。 如何從電腦的角度知道是幾位數,如何取出個個數字? ```` var readline = require('readline'); var rl = readline.createInterface({ input: process.stdin }); var lines = [] rl.on('line', function (line) { lines.push(line) }); rl.on('close', function() { solve(lines) }) // 拿到所有資料 function solve(lines) { // 5 200 => ['5', '200'] let temp = lines[0].split(' ') let n = Number(temp[0]) let m = Number(temp[1]) for(let i=n; i<=m; i++) { if (isNarcissistic(i)) { // 如果 i 是水仙花數 console.log(i) } // 回到題目本身,取出數字; } } // solve(['5 200']) // 回傳數字幾位數 function digitsCount(n) { if (n===0) return 1 // 1, 1e2, 1e3...1e6 , 限制在已知範圍; let result = 0 while(n != 0) { n = Math.floor( n / 10) // 除 10 除了幾次就是幾位數,還要取整數; result++ } return result } // console.log(digitsCount(輸入數字)), 可以確定位數; function isNarcissistic(n) { // 對 10 取餘數可取到最後一數,取餘數完 /10 可取得最後一數; // 幾位數 let m = n let digits = digitsCount(m) let sum = 0 while(m != 0) { let num = m % 10 // 可改成 Math.pow(num, digits) sum += num**digits // 總和=數字的 n 次方相加; m = Math.floor( m / 10) } // 最後 n 一定是 0 ; // console.log(isNarcissistic(輸入數字)) , 判斷是不是水仙花數; // 可簡化成 // return sum === n if (sum === n) { // 最後 n 一定是 0 會沒辦法做這個判斷 因此會 let num = m; return true } else { return false } } // 偷吃步的做法 function isNstr(n) { let str = n + '' let digits = str.length let sum = 0 for(let i=0; i<str.length; i++) { sum += Number(str[i])**digits } return sum === n } ````