---
# System prepended metadata

title: U4.8 Project 4
tags: [7/21, Lidemy心得, 進度筆記, 2020七月第四週, ALG 101, JavaScript]

---

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

````