Avatar ·

كيفية تحديد بسرعة ما إذا كان الجذر التربيعي لعدد صحيح هو عدد صحيح في Java؟

المشكلة

مرحباً بالجميع! أنا مطور Java مبتدئ، وقد واجهت مهمة: التحقق مما إذا كان الجذر التربيعي لعدد صحيح هو عدد صحيح (أي مربع كامل). على سبيل المثال، بالنسبة للرقم 16 تكون الإجابة true (4)، وبالنسبة للرقم 20 تكون false.

لقد كتبت طريقة بسيطة باستخدام حلقة، لكنها تعمل ببطء للأعداد الكبيرة (مثلاً 10^12). جربت Math.sqrt() لكني أخاف من أخطاء التقريب في double. إليك الكود الحالي:

public static boolean isPerfectSquare(int n) {
    if (n < 0) return false;
    for (int i = 0; i * i <= n; i++) {
        if (i * i == n) return true;
    }
    return false;
}

هذا الكود يعمل، لكن عندما يكون n = 2_147_483_647 (الحد الأقصى لـ int) فإن الحلقة تنفذ ~46340 تكراراً، وهذا بطيء. سمعت أنه يمكن استخدام البحث الثنائي أو حيل مع الأعداد العائمة. لكن كيف يمكن فعل ذلك بشكل موثوق وسريع؟ أحتاج إلى حل يعمل مع جميع أنواع int (بما في ذلك الأعداد السالبة) ولا يسبب أخطاء بسبب double. أرجو إرشادي إلى الطريقة المثلى!