Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

หาเลข K หลักมากที่สุดที่หาร X ลงตัว ใน Java

ปัญหา

หาเลขที่มี 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

คำอธิบาย

  1. หาเลข K หลักมากที่สุด: 10^K - 1 (เช่น K=2 → 99, K=3 → 999)
  2. หารเอาเศษ: maxKDigit % X ได้เศษ
  3. ลบเศษออก: 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 > maxKDigit0ไม่มีเลข K หลักที่หาร X ลงตัว (ยกเว้น 0)
X = 1maxKDigitทุกเลขหาร 1 ลงตัว
K = 19 - (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)); 
}