題目 : 找出三邊之和 <= 20 的所有等腰三角形, 但不包含正三角形
提示
- 像 2、2、1 和 1、2、2 的組合不重覆算到
- 三角會有一個底邊和兩個等邊,需要設計兩層迴圈來分工合作
- 任兩邊之和 > 第三邊
任兩邊之差 < 第三邊
預期結果
等腰三角形的特性,兩邊等長,一邊不等長,先設變數
因為上圖三邊長,最小的兩個側邊是 2,最小底邊是 1
let a = 2 // 兩個側邊
let b = 1 // 底邊
let sumSide = 20 // 三邊最大總和
let count = 0 // 組數
寫出等腰三角形的條件,且三邊之和 <= 20
任兩邊之和 > 第三邊,任兩邊之差 < 第三邊
a*2 > b || (b - a) < a // 因為 (b + a) 一定大於 a,所以省略不寫, 而 (a - b) 也一定小於 a,也省略不寫
三邊之和 <= 20
(a*2 + b) <= 20
等腰三角形的特性,兩邊等長,一邊不等長
a !== b
用兩個 for 迴圈找出所有等腰三角形
let maxSide = 9 //最大側邊值
let maxBase = 9 //最大底邊值
let sumSide = 20
let count = 0
for (let a = 2; a <= maxSide; a++) {
for (let b = 1; b <= maxBase; b++) {
if (((a*2 + b) <= sumSide) && (a*2 > b || (b - a) < a) && (a !== b)) {
count++
console.log(`發現等邊三角形 | 三邊長分別為: ${a}、${a}、${b}`)
}
}
}
console.log(`共找到 ${count} 組等腰三角形`)
觀察到預期結果兩個側邊和底邊都 <= 9,所以我設定
最大側邊值 maxSide <= 9,和最大底邊值 maxBase <= 9
結果
結果是對的,但題目並沒有設 最大側邊值 和 最大底邊值,所以要把這兩個值拿掉,之後修改成
let sumSide = 20 //把 let 最大側邊值 和 let 最大底邊值 刪掉
let count = 0
for (let a = 2; a <= sumSide; a++) { //用 sumSide 當最大值
for (let b = 1; b <= sumSide; b++) { //用 sumSide 當最大值
if (((a*2 + b) <= sumSide) && (a*2 > b || (b - a) < a) && (a !== b)) {
count++
console.log(`發現等邊三角形 | 三邊長分別為: ${a}、${a}、${b}`)
}
}
}
console.log(`共找到 ${count} 組等腰三角形`)
輸出結果
因為在
if (((a2 + b) <= sumSide) && (a2 > b || (b - a) < a) && (a !== b)) 裡
已經設置 (a*2 + b) <= sumSide,所以直接把 for迴圈裡 a 和 b 的條件改成
for (let a = 2; a <= sumSide; a++) {
for (let b = 1; b <= sumSide; b++) {
}}