大量寻找斐波纳契数的逻辑失败

时间:2014-01-18 17:29:12

标签: java fibonacci

我试图找出给定的数字是否为fibonocci。逻辑我使用的是5*n^2+4 or 5*n^2-4 will be a perfect square。代码如下

import java.util.*;
import java.math.*;

public class Solution {

public static void main(String [] args){
    Scanner input=new Scanner(System.in);
    int number=input.nextInt();
    int holder[]=new int[number];
    for(int i=0;i<number;i++){
        holder[i]=input.nextInt();
        checkFib(holder[i]);
    }

}

private static void checkFib(int i) {
    // TODO Auto-generated method stub
    long fivePlus=(long) (5*Math.pow(i, 2)+4);
    long fiveMinus=(long)(5*Math.pow(i, 2)-4);
    boolean check=checkSquare(fivePlus,fiveMinus);
    if(check==true){
        System.out.println("IsFibo");
    }else{
        System.out.println("IsNotFibo");
    }

}

private static boolean checkSquare(long fivePlus, long fiveMinus) {
    // TODO Auto-generated method stub
    boolean ret1,ret2;
    if(Math.sqrt(fivePlus)==Math.floor((Math.sqrt(fivePlus)))){
        ret1=true;
    }else{
        ret1=false;
    }
    if(Math.sqrt(fiveMinus)==Math.floor((Math.sqrt(fiveMinus)))){
        ret2=true;
    }else{
        ret2=false;
    }

    return (ret1||ret2);

 }

}

输入格式为 2 //两个测试用例 5 // 5和6表示测试数据 6 ps:尽管有关使用BigInteger的答案很明显,但我并没有看大整数,因为我的测试数据在很长的范围内。

2 个答案:

答案 0 :(得分:1)

Java intlong类型具有大小限制。对于非常大的数字,请查看BigDecimal类。

另一种可能性是,由于在使用Math.pow()函数时转换为double,因此精度会下降。通过以老式方式对数字进行平方来保持所有整数数学运算:乘法。 (即只做5*i*i-4

..而另一个问题是checkSquare使用浮点数学沙子然后用==测试相等性。找到一个纯整数的方法来验证方形。 (或者说,使用sqrt()函数执行平方根,舍入为int,然后将其平方以查看是否返回原始数字。(搜索堆栈溢出为'float'和'=='以查看为什么)

答案 1 :(得分:0)

识别Fibonacci数字:您需要能够快速识别方形数字并准确。有关该主题的大量文献。例如,见:Fastest way to determine if an integer's square root is an integer。但是,你有一个优势:你已经知道了球场,即sqrt(5)n附近的整数。你也知道奇数或偶数。您应该能够在一个或两个平方操作中进行测试。