/** MegaFibonacci
 *  Programa que calcula la funcion de Fibonacci utilizando la 
 *  capacidad de almacenamiento de un arreglo, recibe la posicion
 *  que se desea calcular.
 *CARLOS PIARPUEZAN 256629  */

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class MegaFibonacci extends JFrame implements ActionListener
{
	int numero;
	public JPanel contentPane;
	public JPanel controles;
	public ScrollPane salida;
	private JTextArea output;
	private JButton ejecutar;
	private JLabel message;
	private JTextField posicion;
	
	public void CalFibonacci(int arreglo1[], int arreglo2[], int n)
	{
		int arregloSuma[] = new int [300];
		int carrie = 0;
		for (int i=299;i>=0;i--)
		{
			arregloSuma[i]=0;
		}
		for (int a=1;a<n;a++)
		{
			for (int j=299;j>=0;j--)
			{
				if(arreglo1[j]+arreglo2[j]+carrie>9)
				{
					arregloSuma[j]=(arreglo1[j]+arreglo2[j]+carrie)-10;
					carrie=1;
				}
				else
				{
					arregloSuma[j]=arreglo1[j]+arreglo2[j]+carrie;
					carrie=0;
				}
			}
			for (int k=299;k>=0;k--)
			{
				arreglo1[k]=arreglo2[k];
				arreglo2[k]=arregloSuma[k];
				arregloSuma[k]=0;	
			}
	  	}
	  int c=0;
	  while (arreglo2[c]==0)
	  	c++;
	  for(int b=c;b<300;b++)
	  {
	  	//System.out.print(arreglo2[b]);
	  	String Result = new String();
	   	Result = Integer.toString(arreglo2[b]);	
	   	output.append(Result);
	  }
	}
	
	public Container crearContentPane()
	{
		controles = new JPanel();
		salida = new ScrollPane();
		output = new JTextArea();
		output.setEditable(false);
		ejecutar = new JButton("Ejecutar");
		ejecutar.addActionListener(this);
		message = new JLabel("Digite la n-esima posicion de Fibonacci:");
		posicion = new JTextField();
		contentPane = new JPanel(new GridLayout(1,2));
        contentPane.setOpaque(true);
        controles.setBorder(BorderFactory.createEmptyBorder(
                                        30, //arriba
                                        30, //izquierda
                                        10, //abajo
                                        30) //dereha
                                        );
		controles.setLayout(new GridLayout(3,1));
		controles.add(message);
		controles.add(posicion);
		controles.add(ejecutar);
		salida.add(output);
		contentPane.add(controles);
		contentPane.add(salida);
		
		return contentPane;	
	}
	public void actionPerformed(ActionEvent e)
	{
		if (e.getSource() == ejecutar)
		{
			int array1[],array2[];
			array1 = new int [300];
			array2 = new int [300];
			for (int i=299;i>=0;i--)
			{
				array1[i]= 0;
				array2[i]= 0;
			}
			array1[299]=0;
			array2[299]=1;
			numero = Integer.parseInt(posicion.getText());
			output.append("Fibonacci "+posicion.getText()+" -esimo es:\n");
			CalFibonacci(array1, array2, numero);
			output.append("\n");
		}
	}
	private static void crear_y_MostrarGUI()
    {
        //Con esto se garantiza que la apariencia se de la ventana sea agradable
        JFrame.setDefaultLookAndFeelDecorated(true);

        //Crea y configura la ventana
        JFrame frame = new JFrame("Programa MegaFibonacci");//se crea la ventana usando el contructor que usa un String
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//se define que se destruya la ventana al cerrarla.
        frame.setResizable(false);//El tamaņo de la ventana no es redefinible

        //Crea y configura el content pane
        MegaFibonacci demo = new MegaFibonacci();
        frame.setContentPane(demo.crearContentPane());

        //Despliego y muestro la ventana
        frame.setSize(600, 260);//se le da un tamaņo
        frame.setVisible(true);//se hace visible
    }
    /**
     *Crea y muestra la ventana principal
     */
    public static void main(String[] args)
    {
      System.out.println("Cargando componentes...");
      crear_y_MostrarGUI();
    }
}