Harshad Number คือตัวเลขที่หารด้วยผลรวมของตัวเลขแต่ละหลักลงตัว เช่น 126 หารด้วย 1+2+6 = 9 ลงตัว
- ตัวเลขหลักเดียวทุกตัวเป็น Harshad Number
- Harshad Number มักปรากฏเป็นกลุ่มติดกัน เช่น [1,2,3,4,5,6,7,8,9,10], [110,111,112], [1010, 1011, 1012]
หน้าที่คือเขียนฟังก์ชันรับตัวเลข ตรวจสอบว่าเป็น Harshad หรือไม่ ถ้าไม่ใช่คืน -1 ถ้าใช่คืนความยาวของกลุ่ม Harshad ที่ติดกัน
เช่น
harshadNum(1014) = harshadNum(1015) = harshadNum(1016) = harshadNum(1017) = 4 harshadNum(1) = 10 harshadNum(12) = 1 harshadNum(23) = -1
แบ่งปัญหาเป็นสองฟังก์ชันหลัก
- isHarshad() → รับตัวเลข num คืน boolean ว่าเป็น Harshad หรือไม่
- harshadNum() → ฟังก์ชันหลัก รับตัวเลขจริง เรียก isHarshad() หลายจุด คืนความยาวของ streak
เขียนฟังก์ชัน isHarshad()
const isHarshad = (num) => {
let sum = 0, temp = num;
while(temp){
sum += temp % 10;
temp = Math.floor(temp/10);
}
return num % sum === 0;
}
ฟังก์ชันวนลูปง่ายๆ ที่คืนค่า boolean
ต่อมาเขียน harshadNum()
const harshadNum = (number) => {
if(!isHarshad(number)){
return -1;
}
let streak = 1, prev = number-1, next = number+1;
// ตรวจสอบ streak ก่อนหน้า
while(isHarshad(prev) && prev > 0){
streak++;
prev--;
}
// ตรวจสอบ streak ถัดไป
while(isHarshad(next)){
streak++;
next++;
}
return streak;
};
console.log(harshadNum(1014));
เข้าใจโค้ดข้างต้น
- ตรวจสอบว่า input เป็น Harshad หรือไม่ ถ้าไม่ใช่ หยุดฟังก์ชันคืน -1
- รันลูปย้อนหลังและลูปไปหน้า พร้อมกันจนกว่าจะไม่ใช่ Harshad อัปเดต streak ทุกครั้ง
- สุดท้ายคืนค่า streak
โค้ดเต็ม
ตัวอย่าง
const isHarshad = (num) => {
let sum = 0, temp = num;
while(temp){
sum += temp % 10;
temp = Math.floor(temp/10);
}
return num % sum === 0;
}
const harshadNum = (number) => {
if(!isHarshad(number)){
return -1;
}
let streak = 1, prev = number-1, next = number+1;
while(isHarshad(prev) && prev > 0){
streak++;
prev--;
}
while(isHarshad(next)){
streak++;
next++;
}
return streak;
};
console.log(harshadNum(1014));
ผลลัพธ์
ผลลัพธ์ในคอนโซลจะเป็น
4