我试图找出给定的数字是否为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的答案很明显,但我并没有看大整数,因为我的测试数据在很长的范围内。
答案 0 :(得分:1)
Java int
和long
类型具有大小限制。对于非常大的数字,请查看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附近的整数。你也知道奇数或偶数。您应该能够在一个或两个平方操作中进行测试。