Big Integers in Java Explained
BigInteger Basics
Juda Katta Sonlar Bilan Ishlash: BigInteger
Dasturlashda ba'zan biz standart ma'lumot turlarining imkoniyatlaridan tashqariga chiqadigan sonlar bilan ishlashimizga to'g'ri keladi. Masalan, Java'dagi long tipi o'zida saqlay oladigan maksimal qiymat ga teng. Bu juda katta son bo'lib tuyulishi mumkin, lekin kriptografiya, ilmiy hisob-kitoblar yoki moliyaviy tahlillarda bundan ham kattaroq sonlar bilan ishlash odatiy holdir.
Agar son long chegarasidan oshib ketsa nima bo'ladi? Dasturda xatolik yuz beradi yoki natija kutilmagan bo'ladi. Aynan shu kabi holatlar uchun Java'da BigInteger sinfi mavjud.
BigIntegersinfijava.mathpaketida joylashgan bo'lib, nazariy jihatdan cheksiz uzunlikdagi butun sonlarni ifodalash va ular ustida arifmetik amallarni bajarish imkonini beradi. Uning hajmi faqat kompyuterning mavjud xotirasi bilan cheklanadi.
BigInteger Obyektini Yaratish
BigInteger primitiv tur emas, balki sinf bo'lgani uchun biz uning obyektlarini yaratishimiz kerak. Eng keng tarqalgan usul – bu sonni matn (string) ko'rinishida konstruktorga uzatishdir.
import java.math.BigInteger;
public class Example {
public static void main(String[] args) {
// Katta sonni matn ko'rinishida berib, BigInteger obyekti yaratish
BigInteger kattaSon1 = new BigInteger("123456789012345678901234567890");
// Boshqa bir katta son
BigInteger kattaSon2 = new BigInteger("987654321098765432109876543210");
System.out.println("Birinchi son: " + kattaSon1);
System.out.println("Ikkinchi son: " + kattaSon2);
}
}
Bundan tashqari, BigInteger sinfida tez-tez ishlatiladigan qiymatlar uchun oldindan tayyorlangan konstantalar mavjud. Bu kodni qisqaroq va tushunarliroq qiladi.
| Konstanta | Qiymati |
|---|---|
BigInteger.ZERO | 0 |
BigInteger.ONE | 1 |
BigInteger.TEN | 10 |
BigInteger.TWO | 2 |
Masalan, new BigInteger("1") o'rniga BigInteger.ONE dan foydalanish mumkin.
Asosiy Arifmetik Amallar
BigInteger obyektlari o'zgarmas (immutable) hisoblanadi. Bu shuni anglatadiki, biror arifmetik amal bajarilganda asl obyekt o'zgarmaydi, balki natijani o'zida saqlaydigan yangi BigInteger obyekti qaytariladi.
+, -, *, / kabi standart arifmetik operatorlar BigInteger bilan ishlamaydi. Ularning o'rniga maxsus metodlardan foydalanish kerak.
| Metod | Amal | Misol |
|---|---|---|
add() | Qo'shish (+) | a.add(b) |
subtract() | Ayirish (-) | a.subtract(b) |
multiply() | Ko'paytirish (*) | a.multiply(b) |
divide() | Bo'lish (/) | a.divide(b) |
mod() | Qoldiqni topish (%) | a.mod(b) |
Keling, ushbu metodlarni amalda ko'rib chiqamiz.
import java.math.BigInteger;
public class ArithmeticExample {
public static void main(String[] args) {
BigInteger a = new BigInteger("20000000000000000000");
BigInteger b = new BigInteger("5000000000000000000");
// Qo'shish
BigInteger yigindi = a.add(b);
System.out.println("Yig'indi: " + yigindi); // Natija: 25000000000000000000
// Ko'paytirish
BigInteger kopaytma = a.multiply(b);
System.out.println("Ko'paytma: " + kopaytma); // Natija: 100000000000000000000000000000000000000
// Bo'lish
BigInteger bolinma = a.divide(b);
System.out.println("Bo'linma: " + bolinma); // Natija: 4
}
}
Ko'rib turganingizdek, BigInteger standart ma'lumot turlari sig'maydigan hisob-kitoblarni osonlik bilan bajarish imkonini beradi. Uning yordamida juda katta sonlar bilan ishlash oddiy arifmetik amallar kabi qulay bo'ladi.
Java'da qanday holatlarda long tipi o'rniga BigInteger sinfidan foydalanish zarur bo'ladi?
Quyidagi kod parchasi ekranga nima chiqaradi?
BigInteger a = new BigInteger("100");
BigInteger b = a;
b = b.add(BigInteger.ONE);
System.out.println(a);