Lichen5221 / Report-Daily

記錄每日上課內容與作業。
0 stars 0 forks source link

2021-05-01 #12

Open Lichen5221 opened 3 years ago

Lichen5221 commented 3 years ago

Project 4 老師的解法(我自己試寫的在昨天)

印出聖誕樹

let n = Number(lines[0]) //取得 LIOJ 第一行的數字
  for (let i = 1; i <= n; i++) {
    printTree(i, n)
  }
  for(let i = 1; i <= n; i++) {
    printBottom(n)
}

function printTree(i, n) {
  console.log(
    repeat(' ', n - 1) +
    repeat('*', 2 * i - 1)
  )
} 

function printBottom(n) { // 因為樹幹只有一根往下增生
  console.log(
    repeat(' ', n - 1) +
    repeat('|'
  )
}

function repeat(str, n) {
  let result = ' '
  for (let i = 1; i <= n; i++) {
    result += str
  }
  return result
}

差異:我沒有弄那麼多 function ,直接使用兩個單獨的 for 迴圈。有時候太多 function 我反而會搞混。

印出 NM 乘法表

let N = Number(lines[0])
let M = Number(lines[1])
for (let k = 1; k <= N; k++) {
  for (let i = 1; i <= M; i++) {
    console.log(k + '*' + i + '=' + k*i) //console.log('${k}*${i}=${k*i}'
  }
}

差異:我用逗號分隔,老師用 + 連接,目前還沒研究差別是什麼。

印出水仙花數

老師說這題比較難,但我成功解出來了(雖然是用偷吃步的那個方法 XD,懶人下意識就是只能想到懶法?)。

  1. 判斷幾位數
  2. 如何取出各個數字

如何判斷幾位數方法一:設置範圍(知道題目給予範圍前提下使用)

function digitsCount( ) { //回傳數字幾位數
  if(0 <= n && n < 10) { //簡化:n < 10 即可
    return 1
  } else if (10 <= n && n < 100) { //簡化: n < 100 即可
      return 2
  } else if (n < 1000) { //簡化:1000 === 1e3
    return 3
  }
}

如何判斷幾位數方法二:除以十(老師在講方法一的時候我是想到方法二)

一個數字除十,每次無條件捨去,除幾次變成 0 就是幾位數。

let result = 0
if (n === 0) return 1 // edge case 處理
while(n != 0) {
  n = Math.floor( n / 10)
  result++
}
  return result
}

如何取到各個數字:對 10 取餘數搭配除以 10 (我覺得這個第一次看很難懂)

結合所有 (我沒有放 digitsCount 的 function ,進 LIOJ 的時候要記得):

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)) {
    console.log(i)
  }
}

function isNarcissistic(n) {
  let m = n //宣告一個數字代替程式裡面會改變的 n
  let digits = digitsCount(m)
  let sum = 0
  while(m != 0) {
    let num = m % 10
    sum += num ** digits // Math.pow(num, digits)
    m = Math.floor( m / 10) 
}

  //可簡化成 return sum === n
  if (sum === n) { //有宣告 m 這裡才可以使用到 n ,否則會是改變後的 n 即 0 。
    return true
  } else {
    return false
  }
}

偷吃步方法:

function isNstr(n) {
  let str= n + ' ' // n.toString( ) String(n) 皆可
  let digits = str.length
  let sum = 0
  for (let i = 0; i < str.length; i++) {
    sum += Number(str[i])**digits
  }
  return sum === n
}