用JavaScript驗證等腰三角形

身為剛學JavaScript很菜的菜蟲,記錄一下解題過程

Johnny Fang
Oct 27, 2022

最後更新時間:2022–10–27

這張圖跟標題一點關係也沒有,只是想呈現一個大家在討論的狀態,有達成效果嗎?話說右邊那兩位在幹嘛 | Photo by Akson on Unsplash

💡題目

在三邊和小於等於20的情況下找出所有等腰三角形的邊長組合(但去除正三角形),若找到就印出「發現等腰三角形,三邊長分別為:a、b、c」,其中a、b、c就是邊長數字,最後再印出總共找到幾組等腰三角形。

💡說明

  • 題目沒給單位,看是要公分公尺公里隨便你(如果是公里那應該是納斯卡線等級的三角形,老高會來講一下有沒有外星人),反正只要是整數就好,若不是整數會有無限多個解。
  • 不要重複計算,例如1–2–2跟2–2–1是同一種三角形,只算一組。
  • 組成三角形的有效條件是:兩邊和大於第三邊、兩邊差小於第三邊,所以要記得排除無效的邊長組合。

解題過程

因為剛學,無法像大神們一樣行雲流水直接把code寫爆,所以先寫虛擬碼(Pseudo Code)組織一下解題想法。當初看到這題有先愣了一下,想說,三小,怎麼好像有點難,還要排除無效的哦?我寫的code有這麼聰明嗎?但仔細想想後發現好像也沒那麼難。我是先用最智障最暴力的方式去想怎麼解,理出邏輯後思考如何優化,再將想法轉成code。

邏輯方向

那我就來一個個數數看吧,應該有什麼規律吧。所以我把等腰那兩個相等邊長從最小開始看,再依序搭配第三邊,一個個算下去,例如
1–1–1 => 正三角形,去除
1–1–2 => 無效,因為任兩邊和未大於第三邊,同理,也不會有1–1–3、1–1–4等
到這邊,兩邊長為1的等腰三角形都考慮完了,換2
2–2–1 => 符合
2–2–2 => 正三角形,去除
2–2–3 => 符合
2–2–4 => 無效,任兩邊和未大於第三邊,同理,也不會有2–2–5、2–2–6等
接下來就依照同樣邏輯繼續算下去

由於初學者也沒學過幾根毛,這題基本上就是考你迴圈(Loop),因此我應該要先用第一個loop把三角形雙邊長的數字從最小開始跑,然後再用第二個loop跑第三邊,同時在第二個loop底下寫個if幫我把關,把不符合題目要求的都剔除,只留下我要的。

虛擬碼(Pseudo Code)
有了以上初步想法後,來寫寫看虛擬碼 。

LET x 為等腰三角形相等之兩邊長 //註1
LET c 為第三邊
LET count 為找到幾組等腰三角形

FOR x 從2開始到9,每次x就加1 //註2、3
FOR c 從1開始到9,每次c就加1
IF (2x > c) 且 (2x + c <= 20 ) 且 (x !== c) //註4
就印出 `發現等腰三角形!三邊長分別為:${x}、${x}、${c}`
count = count +1

印出 `共找到 ${count} 組等腰三角形`

註1:先將兩邊長定義為x有兩個好處,第一是將a與b簡化成一個變數,第二是避免1–9–9和9–1–9這類重覆計算

註2:從2是因除了邊長為1的正三角,不會有兩邊長為1的等腰三角(若皆為整數),例如1–1–2則1+1沒大於2,不成立

註3:到9是因若雙邊長為10則三邊和就20了,不符合題目條件

註4:三角形有效的兩個條件都會導向(2x>c)的結論,可以自己算算看就知道,另外再加上「三邊和不大於20」以及「去除正三角形」的條件

🎉成果
最後,就來看看成果長怎樣。

code

用JavaScript驗證等腰三角形的code
在Replit的練習

跑出來的結果

用JavaScript驗證等腰三角形的code,實際跑出來的結果
在Replit跑出來的結果

大概是這樣,歡迎各路高手不吝給予超菜的菜蟲指導 👍

--

--

Johnny Fang

把 Medium 當 Notion 用,寫一下 coding 學習筆記 | email: johnny781222@gmail.com | LinkedIn: www.linkedin.com/in/johnny-fang-9356b2156 | Discord 使用者名稱:johnnyfang