четвер, 19 липня 2012 р.

Довга арифметика


Якщо вам недостатньо точності вбудованих цілочисельних типів і чисел з плаваючою точкою, можна звернутися до двох корисним класах пакет java. math під назвою Biglnteger і BigDecimal. Ці класи призначені для маніпуляцій з числами, що складаються з довільної кількості цифр. Класи Biglnteger і BigDecimal реалізують арифметичні операції довільної точності для цілих і дійсних чисел відповідно. 
При цьому числа розміщуються в сукупності послідовних байтів необхідної довжини. Природно, що ефективність будь-яких операцій над такими числами значно нижче, ніж над величинами типу int.

Для перетворення звичайного числа велике використовується статичний метод valueOf:

Biglnteger а = Biglnteger.valueof(100);

На жаль, до великих чисел не можна застосовувати звичайні математичні оператори + і *.
Замість цього програміст повинен використовувати методи add і multiply з класів для роботи з великими числами.
BigInteger с = a.add(b); // с = a + b
BigInteger d = с.multiply(b.add(BigInteger.valueOf(2))); // d - с * (b + 2)


API:
java.math.BigInteger 1.1
- Biglnteger add(Biglnteger other)
- Biglnteger subtract(Biglnteger other)
- Biglnteger multiply(Biglnteger other)
- Biglnteger divide(Biglnteger other)

- Biglnteger mod(Biglnteger other)

Ці функції повертають суму, різницю, добуток, частку і залишок від ділення великого числа на значення змінної other.

- int compareTo(Biglnteger other)
Повертає 0, якщо дане велике число дорівнює значенню змінної other, від'ємне число, якщо дане велике число менше значення змінної other, і позитивне число в іншому випадку.

- static Biglnteger valueOf(long x)
Повертає велике число, значення якого дорівнює значенню змінної х.

 API:
java.mathBigDecimal 1.1
- BigDecimal add (BigDecimal other)
- BigDecimal subtract (BigDecimal other)
- BigDecimal multiply (BigDecimal other)
- BigDecimal divide (BigDecimal other, int roundingMode)
Повертає суму, різницю, добуток і частку від ділення десяткового числа на значення змінної other. Щоб обчислити частку, потрібно підтримувати режим округлення. Режим BigDecimal.
HALF ROUND UP означає звичайне округлення (тобто у бік зменшення, якщо остання цифра менше 5, і в бік збільшення, якщо вона більше 5). Для звичайних обчислень цього достатньо. Інші режими округлення описані в документації по інтерфейсу API.

- int compareTo(BigDecimal other)
Повертає 0, якщо дане число типу BigDecimal дорівнює значенню змінної other, від'ємне число, якщо дане число менше значення змінної other, і позитивне число в іншому випадку.

- static BigDecimal vaiueOf (long x)
- static BigDecimal vaiueOf (long x, int scale)

Повертає велике десяткове число, значення якого дорівнює значенню змінної х або х/10scale



Работа с большими числами в Java

 

Приклад:

додавання двох чисел (числа знаходяться у файлі)

import java.util.*;
import java.io.*;
import java.math.BigInteger;
public class Main{

public static void main(String[] argv) throws IOException{
new Main().run();
}
PrintWriter pw;
Scanner sc;
public void run() throws IOException{
sc = new Scanner(new File("input.txt"));

BigInteger a,b;
  a=sc.nextBigInteger();
  b=sc.nextBigInteger();
  System.out.println(a.add(b));

pw = new PrintWriter(new File("output.txt"));
pw.println(a.add(b));
pw.close();
}
}

Немає коментарів:

Дописати коментар