Problem z używaniem klasy BigInteger w Javie

2012-12-31 13:20

Rejestracja: 7 lat temu

Ostatnio: 5 lat temu

0

Witam serdecznie,

jak już wspomniałem mam problem z klasą BigInteger, który polega na tym, że zwracany przez nią wynik jest błędny (wynosi tyle co w typie long, czyli ). Oto kod programu:


import java.math.BigInteger;
public class problem2 
{

    public static void main(String[] args) 
    {
        BigInteger sum = BigInteger.valueOf(0);
        long tab[] = new long[4000000];
        tab[0] = 1;
        tab[1] = 2;

        for(int x = 2; x < 4000000; ++x)
        {
            tab[x] = tab[x - 1] + tab[x - 2];
        }

        for(int x = 0; x < 4000000; ++x)
        {
            BigInteger suma = BigInteger.valueOf(0);
            BigInteger tablica = BigInteger.valueOf(tab[x]);

            suma = suma.add(tablica);
            sum = suma;
        }
        System.out.println(sum);
    }

}

Pozostało 580 znaków

2012-12-31 13:31

Rejestracja: 10 lat temu

Ostatnio: 4 lata temu

1

A nie łatwiej:

sum.add(tablica);

? Po co Ci dodatkowa zmienna suma ?

Pozostało 580 znaków

2012-12-31 13:47

Rejestracja: 7 lat temu

Ostatnio: 5 lat temu

0

Masz rację, zapomniałem jeszcze dopisać:
sum = sum.add(tablica);

teraz kod wygląda tak:

import java.math.BigInteger;

public class problem2 
{

    public static void main(String[] args) 
    {
        BigInteger sum = BigInteger.valueOf(0);
        long tab[] = new long[4000000];
        tab[0] = 1;
        tab[1] = 2;

        for(int x = 2; x < 4000000; ++x)
        {
            tab[x] = tab[x - 1] + tab[x - 2];
        }

        for(int x = 0; x < 4000000; ++x)
        {
            BigInteger tablica = BigInteger.valueOf(tab[x]);
            sum = sum.add(tablica);
        }
        System.out.println(sum);
    }

}

jednak nadal nie wiem dlaczego wynik wypada w złym formacie...

Pozostało 580 znaków

bogdans_nz
2012-12-31 19:21
bogdans_nz

Wyrazy ciągu Fibonacciego są tak duże, że przy wypełnianiu tablicy tab następuje przepełnienie - pojawiają się w niej liczby ujemne. Musisz wyrazy ciągu obliczać przy pomocy klasy BigInteger.

Pozostało 580 znaków

bogdans_nz
2013-01-01 01:49
bogdans_nz
0

@_13th_Dragon, nie prościej. W klasie BigInteger nie ma operatorów + oraz +=. Nie znamy też treści zadania (problemu), może stworzenie tablicy zawierającej 4000000 początkowych wyrazów ciągu jest częścią zadania.

No tak, pewnie dla ciebie zastąpienie + na .add jest tak wielkim problemem że to komplikuje wszystko. - _13th_Dragon 2013-01-01 13:12

Pozostało 580 znaków

bogdans_nz
2013-01-01 13:28
bogdans_nz
0

@_13th_Dragon, nie piszesz programu dla mnie, zamieściłeś błędny program w dziale Newbie. Wypisywanie wyniku obliczeń na ekran też jest raczej nierozsądne. Zeby nie było, że się tylko czepiam:

import java.math.BigInteger;
import java.io.FileWriter;

public class problem2 
{
    public static void main(String[] args) 
    {
        int k = 4000000;
        if(args.length > 0)
        {
            try
            {
                k = Integer.parseInt(args[0]);
            }
            catch(NumberFormatException e)
            {
                k = 4000000;
            }           
        }
        BigInteger sum = BigInteger.valueOf(3);
        BigInteger a = BigInteger.valueOf(1);
        BigInteger b = BigInteger.valueOf(2);
        for(int x=2;x<k;++x)
        {
            BigInteger c = a.add(b);
            a = b;
            b = c;
            sum = sum.add(c);
        }
        try
        {
            FileWriter fw = new FileWriter("suma.txt");
            fw.write(""+sum);
            fw.close();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
}

Program działał (dla k=4 000 000) pond godzinę, wynik ma 835 951 cyfr.

Pozostało 580 znaków

2013-01-01 15:32

Rejestracja: 7 lat temu

Ostatnio: 5 lat temu

0

Dziękuję za pomoc, rzeczywiście program nie działał przez źle zadeklarowany typ dla tablicy :)

Pozostało 580 znaków

2013-01-01 15:55

Rejestracja: 14 lat temu

Ostatnio: 2 dni temu

0

Tak a propos:

        BigInteger sum = BigInteger.valueOf(3);
        BigInteger a = BigInteger.valueOf(1);
        BigInteger b = BigInteger.valueOf(2);
        for(int x=2;x<k;++x)
        {
            BigInteger c = a.add(b);
            a = b;
            b = c;
            sum = sum.add(c);
        }

da ten sam wynik co:

        BigInteger a = BigInteger.valueOf(1);
        BigInteger b = BigInteger.valueOf(2);
        k+=2;
        for(int x=2;x<k;++x)
        {
            BigInteger c = a.add(b);
            a = b;
            b = c;
        }
        BigInteger sum = b;
        sum = sum.subtract(BigInteger.valueOf(2));

Zaś czasu zajmie, mniej więcej połowę.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2013-01-01 15:57

Pozostało 580 znaków

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0