2014-01-18 29 views
2

我试图找到一个给定的数目是否fibonocci或我使用ID 5*n^2+4 or 5*n^2-4 will be a perfect square not.The逻辑.The代码如下逻辑失败的一个大数目寻找fibonocci数

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代表测试数据 ps:即使关于使用BigInteger的答案是可观的,但我并不看大整数,因为我的测试数据在长的范围。

+0

http://stackoverflow.com/questions/11878871/determine-是否-n-is-fibonacci-or-not-if-not-find-the-largest-fibonacci-numbe –

+0

你能否提供一些价值观失败的例子? –

+0

我真的没有看到问题......我试着用102334155和输出是“IsFibo”...你看到什么错误? –

回答

1

Java intlong类型具有大小限制。对于真正庞大的数字,请查看BigDecimal课程。

另一种可能性是因为使用Math.pow()函数时转换为double而导致精度下降。通过以旧式方式对数字进行平方运算来保留这个整数数学:乘法。 (即只是做5*i*i-4

..还有一个问题是checkSquare做浮点数学砂,然后测试与==相等。找到一个纯整数的方式来验证方块。 (或者说,用sqrt()函数做平方根,四舍五入到一个int,然后将其平方,看看你是否回到原来的数字(查找堆栈溢出的'float'和'=='以查看为什么)

+0

不是那么大,它在很远的距离仍然失败 –

+0

下一个可能性是你转换到Double(见编辑) – JVMATL

+0

'BigInteger'更适合处理整数。 –

0

认识斐波那契数:您需要能够快速识别平方数和准确有大量的文献的话题见,例如,在这里:。Fastest way to determine if an integer's square root is an integer但是,你有一个优势:你已经知道球场,即sqrt(5)n附近的整数你也知道是奇数还是偶数,你应该可以在一个或两个平方运算中进行测试