BigInteger i wielkie liczby

Napisz program, w którym na początku stworzysz dwie zmienne a i b, w których zapamiętasz liczby wykraczające poza zakres typu long. Następnie wyświetl wyniki działań:

  • dodawania,
  • odejmowania,
  • mnożenia,
  • dzielenia.
  • liczby a podniesionej do 12 potęgi,
  • wartości bezwzględnej z liczby a.

Rozwiązanie poniżej ↓ Nie zaglądaj przed samodzielną próbą rozwiązania!

W tym zadaniu przetestowaliśmy różne funkcje matematyczne klasy BigInteger, która operuje na wielkich liczbach. Przykładowe rozwiązanie:

import java.math.BigInteger;

public class MathOperations {
  public static void main(String[] args){
	  BigInteger a = new BigInteger("-123123123123123123123123123123");
	  BigInteger b = new BigInteger("321321321321321321321321321321");
	  System.out.println("a + b = "+a.add(b).toString());
	  System.out.println("a - b = "+a.subtract(b).toString());
	  System.out.println("a * b = "+a.multiply(b).toString());
	  System.out.println("a / b = "+a.divide(b).toString());

	  System.out.println("a^12= "+a.pow(12));
	  System.out.println("|a|= "+a.abs());
  }
}

Dzięki zastosowaniu klasy BigInteger możesz operować na praktycznie nieograniczonych liczbach. Niestety klasa ta jest nieco powolna, więc używajmy jej tylko wtedy kiedy musimy.

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.

Poniżej znajdziesz archiwalne wpisy z czasów, gdy strona była jeszcze hobbystycznym blogiem.

Mereel

ja mam maulutki problem probowalem najpierw zadeklarowac wartosci, a potem je wydrukowac przy potedze i roznicy pojawily sie problemy nie do przejscia: mport java.math.BigInteger; public class Zad15 { public static void main (String [] args) { BigInteger a = new BigInteger ("-1234567890987654321"); BigInteger b = new BigInteger ("1111111111111111111"); BigInteger suma = a.add(b); BigInteger roznica =a.substract(b); // wyskakuje blad- nie powinno byc kropki BigInteger mnozenie = a.multiply(b); BigInteger potega =a.pow(b); // wystepuje ten sam blad- nie powinno byc kropki BigInteger abc1 = a.abs(); BigInteger abc2 = b.abs(); System.out.println ( "Suma liczby " +a+ " i " +b+ " to " +suma.toString() ); System.out.println ( "Roznica liczby " +a+ " i " +b+ " to " +roznica.toString() ); System.out.println ( "Iloczyn liczb " +a+ " i " +b+ " daje " +mnozenie.toString() ); System.out.println ( "Liczba " +a+ " podniesiona do potegi " +b+ " daje wynik " +potega.toString() ); System.out.println ( "Wartosci bezwzgledne z liczb " +a+ " i " +b+ " to odpowienio " +abc1.toString() + " i " +abc2.toString() );

Slawek

Przy różnicy nie subStract, tylko subtract (literówka) Przy potędze zobacz do API: http://download.oracle.com/javase/1.4.2/docs/api/java/math/BigInteger.html Jak widać metoda ta przyjmuje jako parametr wartość int, nie możesz więc przekazać typu BigInteger.

Witek

Brakuje Ci „ i „ przy słowie import.

bleze

wszystko fajnie, tylko dlaczego jak mam takie liczby: import java.math.BigInteger; <code>public class Hello { public static void main(String[] args){ BigInteger a = new BigInteger("-200"); BigInteger b = new BigInteger("300"); System.out.println("a+b= "+a.add(b).toString()); System.out.println("a-b= "+a.subtract(b).toString()); System.out.println("a*b= "+a.multiply(b).toString()); System.out.println("a/b= "+a.divide(b).toString()); System.out.println("a^12= "+a.pow(12)); System.out.println("|a|= "+a.abs()); } }</code> to a/b daje mi 0?

Mateusz

Klasa BigInteger wyświetla liczby całkowite. Jak chcesz dokładny wynik użyj klasy BigDecimal. Dobre są te klasy. Nigdy chybabym nie wyliczył 7878121814420901997^21465.

alfa

Świetny kurs, brawa dla autora. Mi się prawie komp zawiesił jak próbowałem obliczyć 12345678999999999999999^30000 :)

Janusz

Mnie w obydwu przypadkach: System.out.println("a+b= "+a.add(b).toString()); System.out.println("a+b= "+a.add(b)); generuje taki sam wynik, po co więc stosuje się "toString()" ?

Sławek Ludwiczak

Domyślnie każda klasa w Javie jest pochodną od Object, która posiada metodę toString(). Jeżeli zaimplementujesz ją w swojej klasie to wywołując System.out.print(twojObiekt) domyślnie wywoła właśnie tę metodę. Jeśli dana klasa posiada metodę toString - można pominąć jej jawne wywołanie, choć niejawnie i tak zostanie wywołana. Jeśli dana klasa nie posiada metody toString - zostanie wyświetlony adres obiektu w pamięci. Warto jednak dopisać toString() - bo jest to czytelniejsze.

Lesny

import java.match.BigInteger; public class BigInteger{ public static void main(String[] args){ BigInteger a = new BigInteger("100000000000000000000"); BigInteger b = new BigInteger("1972000000000000000000000"); BigInteger suma = a.add(b); BigInteger roznica = a.substract(b); BigInteger potega = a.xor(b); BigInteger mnozenie = a.multiply(b); BigInteger dzielenie = a.divide(b); System.out.println("SUMA: "+ suma.toString()); System.out.println("ROZNICA: "+ roznica.toString()); System.out.println("POTEGA: "+ potega.toString()); System.out.println("MNOZENIE: "+ mnozenie.toString()); System.out.println("DZIELENIE: "+ dzielenie.toString()); } } Co jest w tym źle? Wywala błędy na kropkach po a np. a.add(b); i tak we wszystkich dzialaniach :(

Quibol

Wywala błędy bo źle zaimplementowałeś klasę matematyczną: zamiast "match" użyj "math" - import java.math.BigInteger; - to raz Nazwa klasy nie może być taka sama jak nazwa metody: w Twoim kodzie linia 1 i linia 3: import java,math.BigInteger; public class BigIntegerr{ to po drugie i po trzecie: odejmowanie pisze się: subtract a nie substract. Jeśli zastosujesz się do powyższego to powinno wszystko współgrać.

Dawod

a tak mozna? import java.math.BigInteger; public class Kalkulator3{ public static void main(String[] args){ BigInteger a = new BigInteger("37489347"); BigInteger b = new BigInteger("27587587"); int c = 2; BigInteger suma = a.add(b); BigInteger roznica = a.subtract(b); BigInteger mnozenie = a.multiply(b); BigInteger potega = a.pow(c); BigInteger wartosc = a.abs(); System.out.println(suma.toString()); System.out.println(roznica.toString()); System.out.println(mnozenie.toString()); System.out.println(potega.toString()); System.out.println(wartosc.toString()); } }

szczepan

A co jeśli potęgowanie dwóch zmiennych int daje w wyniku liczbę większą niż long może udźwignąć? Jak wynik takiego potęgowania zmienić na BigInteger?

Paywer

Dlaczego dzielenie przy użyciu BigDecimal jest niemożliwe? Wywala mi błąd. A jak zamienię na BigInteger to jest ok?