จำนวนที่มีตัวประกอบเฉพาะเป็น 2, 3 หรือ 5 เรียกว่า จำนวนน่าเกลียด ตัวเลขที่น่าเกลียดบางส่วน ได้แก่ 1, 2, 3, 4, 5, 6, 8, 10, 12, 15 เป็นต้น
เรามีตัวเลข N และภารกิจคือการหาเลขน่าเกลียดตัวที่ N ตามลำดับเลขน่าเกลียด
ตัวอย่างเช่น:
อินพุต-1:
N = 5
ผลลัพธ์:
5
คำอธิบาย:
เลขขี้เหร่ที่ 5 ตามลำดับเลขน่าเกลียด [1, 2, 3, 4, 5, 6, 8, 10, 12, 15] คือ 5
อินพุต-2:
N = 7
ผลลัพธ์:
8
คำอธิบาย:
เลขขี้เหร่ที่ 7 ตามลำดับเลขน่าเกลียด [1, 2, 3, 4, 5, 6, 8, 10, 12, 15] คือ 8
แนวทางในการแก้ปัญหานี้
วิธีง่ายๆ ในการแก้ปัญหานี้คือตรวจสอบว่าจำนวนที่กำหนดนั้นหารด้วย 2 หรือ 3 หรือ 5 ลงตัวหรือไม่ และติดตามลำดับจนถึงจำนวนที่กำหนด ตอนนี้ให้ค้นหาว่าตัวเลขตรงตามเงื่อนไขทั้งหมดของตัวเลขที่น่าเกลียดหรือไม่ จากนั้นให้ส่งคืนตัวเลขเป็นผลลัพธ์
- ป้อนข้อมูลตัวเลข N เพื่อค้นหาตัวเลขน่าเกลียดที่ N
- ฟังก์ชันบูลีน isUgly(int n) ใช้ตัวเลข 'n' เป็นอินพุตและส่งกลับค่า True หากเป็นตัวเลขที่น่าเกลียด มิฉะนั้นจะเป็นเท็จ
- ฟังก์ชันจำนวนเต็ม findNthUgly(int n) ใช้ตัวเลข 'n' เป็นอินพุตและส่งกลับ n ตัวเลขที่น่าเกลียดเป็นผลลัพธ์
ตัวอย่าง
public class UglyN {
public static boolean isUglyNumber(int num) {
boolean x = true;
while (num != 1) {
if (num % 5 == 0) {
num /= 5;
}
else if (num % 3 == 0) {
num /= 3;
}
// To check if number is divisible by 2 or not
else if (num % 2 == 0) {
num /= 2;
}
else {
x = false;
break;
}
}
return x;
}
public static int nthUglyNumber(int n) {
int i = 1;
int count = 1;
while (n > count) {
i++;
if (isUglyNumber(i)) {
count++;
}
}
return i;
}
public static void main(String[] args) {
int number = 100;
int no = nthUglyNumber(number);
System.out.println("The Ugly no. at position " + number + " is " + no);
}
} ผลลัพธ์
The Ugly no. at position 100 is 1536.