Problem z używaniem klasy BigInteger w Javie

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

A nie łatwiej:

sum.add(tablica);

? Po co Ci dodatkowa zmienna suma ?

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...

1

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.

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.

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.

0

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

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ę.

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