Большие числа
From AsIsWiki
| Вопросы и ответы |
Поток управления | Основные конструкции Java | Массивы
Contents |
Работа с большими числами
Классы BigInteger и BigDecimal принадлежат пакету java.math
Классы предназначены для выполнения действий с числами, состоящими из произвольного количества цифр.
Статический метод valueOf() преобразует обычное число в большое:
BigInteger a = BigInteger.valueOf(100);
Для выполнения арифметических операций с большими числами используются методы add() и multiply():
BigInteger c = a.add(b); // c = a + b BigInteger d = c.multiply(b.add(BigInteger.valueOf(2))); // d = c * (b + 2)
В отличие от C++, Java не поддерживает перегрузку операторов.
Поэтому разработчики класса BigInteger были лишены возможности переопределить операторы + и * для методов add() и multiply().
Следующая программа оперирует большими числами при расчете вероятности выигрыша в лотерее.
Например, если надо угадать 60 чисел из 490, то шанс выиграть равен 1 из 716395843461995557415116222540092933411717612789263493493351013459481104668848.
import java.math.*;
import java.util.*;
public class BigIntegerTest {
public static void main(String[] args) {
Scanner in = Scanner.create(System.in);
System.out.print("Сколько номеров? ");
int k = in.nextInt();
System.out.print("Наибольший номер? ");
int n = in.nextInt();
/*
* Вычисление выражения
* n * (n - 1) * (n - 2) * ... * (n - k + 1)
* -----------------------------------------
* 1 * 2 * 3 * ... * k
*/
BigInteger lotteryOdds = BigInteger.valueOf(1);
for (int i = 1; i <= k; i++) {
lotteryOdds = lotteryOdds
.multiply(BigInteger.valueOf(n - i + 1))
.divide(BigInteger.valueOf(i));
}
System.out.println("Ваши шансы 1 из " + lotteryOdds);
}
}
Справочник
java.math.BigInteger
BigInteger add(BigInteger other) // сложение BigInteger subtract(BigInteger other) // вычитание BigInteger multiply(BigInteger other) // умножение BigInteger divide(BigInteger other) // деление BigInteger mod(BigInteger other) // остаток от деления
int compareTo(BigInteger other) // сравнение Возвращает: 0 если BigInteger == other -1 если BigInteger < other +1 если BigInteger > other
static BigInteger valueOf(long x) // конвертирует x в BigInteger
java.math.BigDecimal
BigDecimal add(BigDecimal other) // сложение BigDecimal subtract(BigDecimal other) // вычитание BigDecimal multiply(BigDecimal other) // умножение BigDecimal divide(BigDecimal other, int roundingMode) // деление (округление см. ниже)
roundingMode.ROUND_HALF_UP // округляет в меньшую сторону если число < 5,
// иначе округляет в большую сторону
Другие режимы округления описаны в документации.
int compareTo(BigDecimal other) // сравнение Возвращает: 0 если BigDecimal == other -1 если BigDecimal < other +1 если BigDecimal > other
static BigDecimal valueOf(long x) // конвертирует x в BigDecimal static BigDecimal valueOf(long x, int scale) // конвертирует x/10^scale в BigDecimal
| Вопросы и ответы |