# 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
}
````