Большие числа

From AsIsWiki
Jump to: navigation, search
Форум

Назад | Оглавление | Дальше


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



Форум

Назад | Оглавление | Дальше

Personal tools
Namespaces

Variants
Actions
Navigation
Tools