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
- 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
print 1st layer, n = 2, i = 1
first layer: 1 star -> print 2i-1 stars
1 blank -> print n-i blankprint 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
print 1st layer; n = 3, i =1
first layer: 1 star -> 2i-1
2 blank -> n-iprint 2nd layer; n = 3, i = 2
second layer: 3 star -> 2i-1
1 blank -> n-iprint 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)
- 先找出 n 為幾位數,是否能用數字轉字串,再取字串長度,就能夠得到位數
- 取 (n[0]) 幾位數的平方 + (n[1]) 幾位數的平方... 這裡應該有一個迴圈
- 接著用 === 判斷是否這個運算等於 n
- 如果是,console.log(n),否則跳過
- 這是一開始粗略的想法
- 看了解答以後,我完全想不到可以用除以 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))