(记数-进制转换-java)用fibonacci数列为基做进制转换

如同上一篇解释http://blog.csdn.net/fzxy002763/article/details/7959555的一些基本概念,这里我们采用fibonacci做为基

根据zeckendorf定理,这里如果j>>(意思为远大于,至少大两个)k -> j>k+2,那么任何一个正整数都有唯一表示,不过在程序里面没有用到这个。

注意fibonacci作为基这没有重复项,基初始几个为0 1 2 3 5 8 13。。。。这样,不存在1 1的重复,需要注意,代码还是java的

import javax.print.DocFlavor.STRING;
import javax.swing.*;

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.io.StringWriter;
import java.math.*;

public class transform {

	/**
	 * make by Edward.xu   
	 * 9.8.2012 0:24
	 * small version 0.3
	 */
	// the O(finbonacciNumber.length()*n)
	static JTextField deciamlField;
	static JTextField finbonacciField; 
	static long decimal;
	static long finbonacci;
	static long decimalPrint; 
	static String decimalNumber;
	static String finbonacciNumber;
	
	// debug use
	// it's a loop flag
	static int i;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// print function,long time no to use java
		// to write a kit
		finbonacciNumber = new String();
		decimalNumber = new String();
		System.out.println("徐方鑫特制-超级小型机制转换器");
		// create a frame which is the main panel
		JFrame frame = new JFrame("徐方鑫设计-must");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// the main panel
		JPanel panel = new JPanel();
		frame.add(panel);
		// i like use the box.expecially the vertical box		
		Box mainBox = Box.createVerticalBox();
		panel.add(mainBox);
		// to prove my write
		/*
		JLabel verionLabel = new JLabel("Version 0.1");
		JLabel schoolLabel = new JLabel("Master of must 2012");
		JLabel nameLabel = new JLabel("Made by Edward.xu");
		mainBox.add(verionLabel);
		mainBox.add(schoolLabel);
		mainBox.add(nameLabel);
		*/
		// the first box which tip this is decimal number
		Box deciamlBox = Box.createHorizontalBox();
		mainBox.add(deciamlBox);
		JLabel deciamlLabel = new JLabel("Deciaml:");
		deciamlField = new JTextField();
		deciamlBox.add(deciamlLabel);
		deciamlBox.add(deciamlField);
		// the second box which tip this is finbonacci number
		Box finbonacciBox = Box.createHorizontalBox();
		mainBox.add(finbonacciBox);
		JLabel finbonacciLabel = new JLabel("finbonacci:");
		finbonacciField = new JTextField();
		finbonacciBox.add(finbonacciLabel);
		finbonacciBox.add(finbonacciField);
		// the button start transform
		Box buttonBox = Box.createHorizontalBox();
		mainBox.add(buttonBox);
		JButton decToBinButton = new JButton("10 to Fibonacci");
		JButton binToDecButton = new JButton("Fibonacci to 10");
		buttonBox.add(decToBinButton);
		buttonBox.add(binToDecButton);
	    // the main function of the calculate
		decToBinButton.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e1)
			{
				finbonacciNumber = "";
				try{
				decimalNumber = deciamlField.getText();
				decimal = Long.parseLong(decimalNumber);
				if(decimal > 1000) throw new Exception();
				// main transform
				
				// calculate the top bit
				for(i=0 ; calFibonacci(i) < decimal ; i++);
				if(calFibonacci(i) == decimal) i = i;
					else if(calFibonacci(i) > decimal) i = i-1;
				//System.out.print("i "+i);
				// end calculate the tip bit
				
				// that's notice i use the function
				// like i can choice what bit is 1
				// that change bit data to the number
				// is too 2,but funny
				// to use the function like change to the decimal
				finbonacci = (long)Math.pow(10, i-1);
				finbonacciNumber = String.valueOf(finbonacci);
				finbonacciField.setText(finbonacciNumber);
				
				// update the new decimal which had minus the top bit
				decimal = decimal - calFibonacci(i);
				//System.out.println("   the decimal least:"+decimal);
				
				// warning because of the long limit
				// add my lazy,it's time to go to bed
				// so i won't to change it to the string
				// that cause it's only can change the number 
				// below 1000
				// even it can be solve , but i won't to do 
				while(decimal !=0)
				{
					// use the same function calculate the bit second
					for(i=0 ; calFibonacci(i) < decimal ; i++);
					if(calFibonacci(i) == decimal) i = i;
						else if(calFibonacci(i) > decimal) i = i-1;
					//System.out.print("i2 "+i);
					decimal = decimal - calFibonacci(i);
					//System.out.println("   the decimal least2:"+decimal);
					finbonacci = finbonacci + (long)Math.pow(10, i-1);
					finbonacciNumber = String.valueOf(finbonacci);
					finbonacciField.setText(finbonacciNumber);
				}
				}catch(Exception ex1)
				{
					JOptionPane.showMessageDialog(null, "你是在填数字吗?(注意不要大于1000),这可以改良,但是我懒得改了,注意,转换为显示的时候为乘10,改良就直接按照字符11这样打印,不要用Long类型做保存,用string,这样添加就行了。。。挺晚了,想睡了,不改了");
				}
			}
		});
		binToDecButton.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e2)
			{
				try{
					finbonacci = 0;
					decimal = 0;
					decimalPrint = 0;
					finbonacciNumber = finbonacciField.getText();
					finbonacci = Long.parseLong(finbonacciNumber);
					// notice that's is decimalPrint
					decimalPrint = finbonacci % 10;
					for (int i = finbonacciNumber.length() - 1; i>0 ; i--)
					{
						// the calculate this bit
						decimal = finbonacci / (long) (Math.pow(10, i)) ;
						finbonacci = finbonacci - (finbonacci / (long) (Math.pow(10, i)))*(long) Math.pow(10, i);
						// calculate
						// different between -2 basement
						// the 10 is act as calFibonacci(2),not calFinbonacci(1)
						// it's must be warning
						decimalPrint = decimalPrint + decimal * calFibonacci(i + 1);
						//System.out.println("decimal:"+decimal+" i:"+i);
					}
					System.out.println("decimalPrint:"+decimalPrint);
					//System.out.println(decimal);
					decimalNumber = String.valueOf(decimalPrint);
					deciamlField.setText(decimalNumber);
				}catch(Exception ex1)
				{
					JOptionPane.showMessageDialog(null, "你是在填数字吗?");
				}					
			}
		});
		// start the frame and panel,make it visible
		frame.setSize(300,140);
		frame.setVisible(true);
	}
	//that's to calculate the Fibonacci serials
	public static long calFibonacci(int n)
	{
		long fibonacci_one,fibonacci_two;
		fibonacci_one = 0;
		fibonacci_two = 1;
		for(int i = 0 ; i < n ; i++)
		{
			long temp;
			// to simple is
			// temp = b
			// b = b + a
			// a = temp
			temp = fibonacci_two;
			fibonacci_two = fibonacci_two + fibonacci_one ;
			fibonacci_one = temp;
			//System.out.println(" "+fibonacci_two+" ");
		}
		if(n == 0) return 0;
		else if(n == 1) return 1;
		else if(n == 2) return 2;
		else return fibonacci_two;
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值