Program na ciag Fibonacciego

0

Witam. Napisalem sobie banalny program obliczajacy ciag liczb Fibonacciego. Pytanie tylko, dlaczego po paru "razach" wywala on wartosc ujemną?

import java.io.*;
import java.util.Scanner;

public class ciag1 {
    public static void main (String[] args){
	double wynik;
	double n = 1.0;
	double eins;
	double zwei;
	String s;
	Scanner sc = new Scanner(System.in);
	while (true){
	    eins = 2.0*n + 1.0;
	    zwei = 3.0*n + 2.0;
	    wynik = eins / zwei;
	    n++;
	    
	    System.out.println(wynik);
	}
    }
}

Pozdrawiam!

0

Po co Ci double? Przecież w ciągu masz tylko liczby całkowite a na dodatek dodatnie.. Co konkretnie chcesz obliczyć? Sumę n elementów? A może wypisać n elementów ciągu? Bo ja nie wiem o masz na myśli pisząc "obliczający ciąg.."

import java.io.*;
import java.util.Scanner;
public class fibonacci {
	public static void main(String[] args) throws java.io.IOException {
		int n,one=1,two=1;
		System.out.println("Podaj n\n:");
		Scanner input = new Scanner(System.in);
		String text = input.nextLine();
		n = Integer.parseInt(text);
		System.out.print("1,1,");
		for(int i=2;i<n;i++){
			System.out.print(one+two+",");
			two=two+one;
			one=two-one;
		}
	}
}
0

Shietzzz... sorki, nie ten kod, z rozmachu pomyliłem okna :/

import java.io.*;
import java.util.Scanner;
public class ciag2 {
    public static void main (String[] args) {
	long a, b, wynik;
	Scanner sc = new Scanner(System.in);
	String xd;
	a = 0;
	System.out.println(a);
	b = 1;
	System.out.println(b);
	wynik = a + b;
	System.out.println(wynik);
	while (true){
	a = b;
	b = wynik;
	wynik = a +b;
	System.out.println(wynik);
	xd = sc.nextLine();
	}
    }
} 
0

Pewnie przekraczasz zakres typu long, ciag Fibonacciego bardzo szybko rośnie.

0
import java.util.Scanner;

public class Fibonacci {
    public static void main(String[] args) {
        System.out.print("Ile liczb ma zostać wydrukowanych?\n");
        //przyjmujemy, ile liczb w ciągu mamy wyliczyć. Wielkość większa niż 89 zabroniona.
        Scanner sc = new Scanner(System.in);
        int lenght = sc.nextInt();
        if (lenght > 89) { //Wpisano większą wartość niż 89
            System.err.println("Za dużo!");
            System.exit(0);
        }
        else if (lenght < 1) { //Wpisano wartość mniejszą niż 1
            System.err.println("Za mało!");
            System.exit(0);
        }
        else if (lenght == 1) { //tylko jedna liczba ma być wydrukowana
            System.out.println(1);
            System.exit(0);
        }
        else if (lenght == 2) { //tylko dwie liczby mają być wydrukowane
            System.out.println(1);
            System.out.println(1);
            System.exit(0);
        }
        long a = 1L, b = 1L;
        System.out.println(1);
        System.out.println(1);
        for(int i = 0; i <= lenght; i++) {
            //przyjmujemy, że B reprezentuje większą liczbę
            long var = a + b;
            a = b;
            b = var;
            System.out.println(var);
        }
    }
}

To tylko podstawowa wersja, teraz trzeba spróbować ją jakoś skompresować.

Maksimum 89 wzięło się stąd, że 90 wartość zwraca liczbę z minusem.

0
import java.io.*;
import java.math.BigInteger;
import java.util.Scanner;
public class fibonacci {
	public static void main(String[] args) throws java.io.IOException {
		BigInteger one = BigInteger.ONE;
		BigInteger two = BigInteger.ONE;
		int n;
		System.out.println("Podaj n\n:");
		Scanner input = new Scanner(System.in);
		String text = input.nextLine();
		n = Integer.parseInt(text);
		System.out.print("1,1,");
		for(int i=2;i<n;i++){
			System.out.print(two.add(one)+",");
			two=two.add(one);
			one=two.subtract(one);
		}
	}
}
0

@kopernik, nie ma sensu żeby program liczący dużo wyrazów ciągu Fibonacciego pisał wyniki na ekran.

import java.io.*;
import java.math.BigInteger;
import java.util.Scanner;

public class Fibonacci {
    public static void main(String[] args) throws java.io.IOException {
        BigInteger one = BigInteger.ONE;
        BigInteger two = BigInteger.ONE;
        int n;
        System.out.print("Podaj n: ");
        Scanner input = new Scanner(System.in);
        String text = input.nextLine();
        n = Integer.parseInt(text);
        FileWriter fw = null;
        try
        {
            fw = new FileWriter("fibo.txt");
        }
        catch(IOException e)
        {
            System.out.println(e);
            System.exit(0);
        }
        fw.write("1\n");
        fw.write("1\n");        
        for(int i=2;i<n;i++){
            fw.write(two.add(one)+"\n");
            two=two.add(one);
            one=two.subtract(one);
        }
        if(fw!=null)
        try
        {
            fw.close();
        }
        catch(IOException e)
        {
            System.out.println(e);
        }
    }
}
0

@kopernik oraz @bogdans_nz , co na 100% nie ma sensu to oszczędzanie na zmiennych kosztem czasu działania programu.

        for(int i=2;i<n;++i)
          {
            BigInteger next=two.add(one);
            fw.write(next+"\n"); // ewentualnie dopisanie do pliku
            one=two;
            two=next;
          }

Ma sens też oszczędzić nieco na przypisaniach:

BigInteger[] tb=new BigInteger[2];
        tb[0]=BigInteger.ONE;
        tb[1]=BigInteger.ONE;
        for(int i=2,k=0,p=1;i<n;++i,k^=1,p^=1)
          {
            tb[k]=tb[k].add(tb[p]);
            fw.write(tb[k]+"\n"); // ewentualnie dopisanie do pliku
          }
0

@kopernik, nie chodziło mi o czas wypisywania na ekran, ale o to, że ekran nie pomieści tyle informacji. O BigInteger nie wspominałem, bo dzień wcześniej był taki post Problem z używaniem klasy BigInteger w Javie. Chodziło w nim o obliczenie sumy pierwszych 4 000 000 wyrazów ciągu Fibonacciego. Nie próbowałem wypisywać tej sumy na ekranie, zapisywanie wyniku do pliku trwało około 6 minut (obliczenia około godziny).

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