ปัญหา
หาเลขที่มี K หลัก (K-digit number) ที่ มากที่สุด และ หาร X ลงตัว
ตัวอย่างโค้ด
import java.io.*;
public class Demo {
public static int largestKDivisible(int x, int k) {
// เลข K หลักมากที่สุด = 10^K - 1
// เช่น K=2 -> 99, K=3 -> 999
int maxKDigit = (int) Math.pow(10, k) - 1;
// หาตัวคูณของ X ที่ใกล้ maxKDigit มากที่สุด
// = maxKDigit - (maxKDigit % X)
return maxKDigit - (maxKDigit % x);
}
public static void main(String[] args) {
int x = 25; // หารด้วย 25
int k = 2; // 2 หลัก
int result = largestKDivisible(x, k);
System.out.println("เลข " + k + " หลักมากที่สุดที่หาร " + x + " ลงตัว: " + result);
}
}
ผลลัพธ์
เลข 2 หลักมากที่สุดที่หาร 25 ลงตัว: 75
คำอธิบาย
- หาเลข K หลักมากที่สุด:
10^K - 1(เช่น K=2 → 99, K=3 → 999) - หารเอาเศษ:
maxKDigit % Xได้เศษ - ลบเศษออก:
maxKDigit - remainderได้ตัวคูณของ X ที่ ≤ maxKDigit และมากที่สุด
ตัวอย่างคำนวณ (X=25, K=2)
maxKDigit = 10^2 - 1 = 99 remainder = 99 % 25 = 24 result = 99 - 24 = 75 ✓ (75 = 25 × 3)
Edge Cases
| กรณี | ผลลัพธ์ | คำอธิบาย |
|---|---|---|
| X > maxKDigit | 0 | ไม่มีเลข K หลักที่หาร X ลงตัว (ยกเว้น 0) |
| X = 1 | maxKDigit | ทุกเลขหาร 1 ลงตัว |
| K = 1 | 9 - (9%X) | เลข 1 หลักมากที่สุดคือ 9 |
ข้อจำกัดของ int
Math.pow(10, k) สำหรับ k ≥ 10 จะเกิน Integer.MAX_VALUE (2,147,483,647)
// ใช้ long สำหรับ K ใหญ่
public static long largestKDivisibleLong(long x, int k) {
long maxKDigit = 1;
for (int i = 0; i < k; i++) maxKDigit *= 10;
maxKDigit -= 1;
return maxKDigit - (maxKDigit % x);
}
BigInteger สำหรับ K ใหญ่มาก
import java.math.BigInteger;
public static BigInteger largestKDivisibleBig(BigInteger x, int k) {
BigInteger maxKDigit = BigInteger.TEN.pow(k).subtract(BigInteger.ONE);
return maxKDigit.subtract(maxKDigit.mod(x));
}