D16_ Unit4 作業們


Posted by Christy on 2021-05-04

LIOJ 1022 印出金字塔

這個題目有三個要解決的問題:

ㄧ、如何印出 n 層星星

二、如何印出第 i 層有 2*i - 1 個星星,也就是 1, 3, 5, 7, 9...

三、要怎麼在星星之前印出空白,空白的規律是:
n = 1,印出一層星星,這一層星星零個空白
n = 2,印出兩層星星,第一層星星ㄧ個空白,第二層零個空白
n = 3,印出三層星星,第一層星星兩個空白,第二層一個空白,第三層零個空白

假設空白叫做 blank,要找出 blank, n 與 i 之間的關係

n = 1: print n layer

  1. print 1 layer
    first layer: 1 star -> print 2i-1 stars(i = 1)
    0 blank -> print n-i blank(1 - 1 = 0)

n = 2: print n layer, i = 1 & 2

  1. print 1st layer, n = 2, i = 1
    first layer: 1 star -> print 2i-1 stars
    1 blank -> print n-i blank

  2. print 2nd layer, n = 2, i = 2
    second layer: 3 star -> print 2i-1 stars
    0 blank -> print n-i stars


n = 3: print n layer, i = 1 & 2 & 3

  1. print 1st layer; n = 3, i =1
    first layer: 1 star -> 2i-1
    2 blank -> n-i

  2. print 2nd layer; n = 3, i = 2
    second layer: 3 star -> 2i-1
    1 blank -> n-i

  3. print 3nd layer; n = 3, i = 3
    third layer: 5 star -> 2i-1
    0 blank -> n-i


  • n 是總數,i 是順序
let  n = 2
for (let i=1; i<=n; i++) {
    printLayer(i, n)
}
//想要印出總共有 n 層以及第 i 層分別有幾格空白 + 幾顆星星

function printLayer(i, n){
    let str = repeat(' ', n - i) + repeat('*', 2*i -1)
    console.log(str)
}
//印出每一行第 i 層的空白 + 星星

function repeat(str, n) {
    let s = ''
    for (let i=1; i<=n; i++) {
        s += str
    }
    return s
}
//重複印出「每ㄧ層需要的空白 + 星星」X n 層

LIOJ 1023 印出聖誕樹

  • 這題首先要先理解之前的金字塔,其實規律是一樣的,差別在於樹幹只要計算有幾個空白跟後面接一支樹幹,每一層都一樣。
let n =5

for (let i=1; i<=n; i++) {
    printLayer(i, n)
}
//把每一層星星印出來

for (let i=1; i<=n-1; i++){
    printTrunk(n)
}
//把每一層樹幹印出來

function printLayer(i, n){
    let str = repeat(' ', n - i) + repeat('*', 2*i -1)
    console.log(str)
}
//說明一層星星裡面的結構

function printTrunk(n){
    console.log(repeat(' ', n - 1) + '|')
}
//說明每一層樹幹裡面的結構,其實就是 n-1 個空白 + 一支樹幹,每層都一樣

function repeat(str, n) {
    let s = ''
    for (let i=1; i<=n; i++) {
        s += str
    }
    return s
}
//重複印出「每一層星星」+「每一層樹幹」

結果:
    *
   ***
  *****
 *******
*********
    |
    |
    |
    |

LIOJ 1024 NM 乘法表

題目:
把 9*9 擴展到 N * M,就是輸出:

1*1, 1*2...1*M
2*1, 2*2...2*M
....
N*1, N*2...N*M

簡單來說,N 代表 N 個數,M 代表每個數要乘到多少,例如說 N=2, M=3,就會是:

1*1, 1*2, 1*3
2*1, 2*2, 2*3

現在給你 N 以及 M,請你輸出 NM 乘法表會長什麼樣子
let n = 2
let m = 3

for (a=1; a<=n; a++) {
    for (i=1; i<=m; i++) {
        console.log(a + '*' + i + '=' + a*i)
    }
}

LIOJ 1025 水仙花數

  • 做這題時,我的想法是:(先設一個要求的數字為 n)
  1. 先找出 n 為幾位數,是否能用數字轉字串,再取字串長度,就能夠得到位數
  2. 取 (n[0]) 幾位數的平方 + (n[1]) 幾位數的平方... 這裡應該有一個迴圈
  3. 接著用 === 判斷是否這個運算等於 n
  4. 如果是,console.log(n),否則跳過
  5. 這是一開始粗略的想法

  • 看了解答以後,我完全想不到可以用除以 10 跟取餘數的方式把數字拿出來。原來我一開始的想法是偷吃步...,果然沒有數學基礎是真的想不出用數學邏輯去解題的
function narNum(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
}

console.log(narNum(153))









Related Posts

MPLAB X IDE 黑色主題

MPLAB X IDE 黑色主題

儲存空間使用相關指令

儲存空間使用相關指令

[JavaScript] ES6:Template Literals 樣板字面值

[JavaScript] ES6:Template Literals 樣板字面值


Comments