Szkolenia programowania we Wrocławiu
Kurs Java Podstawy - rozszerzony

Rozwiązanie 1.5

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 Funkcje{
  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());
  }
}

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

Komentarze

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;

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());
}
}

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?