Java 查找一个数字是否为斐波那契数?在爪哇

Java 查找一个数字是否为斐波那契数?在爪哇,java,fibonacci,Java,Fibonacci,问题定义 给定一个数,告诉它是否为斐波那契数 输入 测试案例数量1Try@rossum解决方案: int one = (int) Math.sqrt((5*n*n)+4); int two = (int) Math.sqrt((5*n*n)-4); 永远不要测试双值是否相等,它(几乎)每次都失败。如果您声明: double one = 1.0; double two = 1.0; one可能是1.0000000001,two可能是1.00000000000000001。您可以看到这些值(完

问题定义

给定一个数,告诉它是否为斐波那契数

输入

  • 测试案例数量1Try@rossum解决方案:

    int one = (int) Math.sqrt((5*n*n)+4);
    
    int two = (int) Math.sqrt((5*n*n)-4);
    
    永远不要测试双值是否相等,它(几乎)每次都失败。如果您声明:

    double one = 1.0;
    double two = 1.0;
    
    one
    可能是1.0000000001,
    two
    可能是1.00000000000000001。您可以看到这些值(完全)不同

    在这种情况下,您应该这样比较:

    if(Math.abs(one-two)<0.001){
    //do something
    }
    

    if(Math.abs(一二)
    d%1==0
    对于任何双精度
    d
    ,都不是一个完全可靠的测试,因为例如
    Math.sqrt
    中的一些小错误可能会给您提供
    d=2.00000000 4
    或一些东西,而不是
    2
    。相反,您应该与公差进行比较,例如
    d%1<0.001
    如果
    d
    始终为正。

    导入java.io.BufferedReader;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class BasicEmployeeService {
    
        public static void main(String[] args) throws IOException {
            /* Enter your code here. Read input from STDIN. Print output to STDOUT */
            System.out.println("Enter the number");
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int tc = Integer.parseInt(br.readLine());
            for (int i = 0; i < tc; i++) {
                int n = Integer.parseInt(br.readLine());
                doThis(n);
    
            }
    
        }
    
        public static void doThis(int n) {
            long square = n * n;
            double one = Math.sqrt((5 * square) + 4);
    
            double two = Math.sqrt((5 * square) - 4);
            if (one % 1 == 0 || two % 1 == 0) {
                System.out.println("IsFibo");
            } else {
                System.out.println("IsNotFibo");
    
            }
        }
    }
    
    导入java.io.IOException; 导入java.io.InputStreamReader; 公共类基本员工服务{ 公共静态void main(字符串[]args)引发IOException{ /*在此处输入代码。从标准输入读取输入。将输出打印到标准输出*/ System.out.println(“输入编号”); BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in)); int tc=Integer.parseInt(br.readLine()); 对于(int i=0;i
    实际答案是将int类型更改为double,同时将值读取为

    Double tc = Double.parseDouble(br.readLine());
    
    并将double传递给函数doThis

    public static void doThis(Double n) {
    

    现在它工作得非常好

    “因此,如果n是一个斐波那契数,那么5n^2+4或5n^2-4都是正方形。”代码看起来很奇怪,您使用的
    ==0
    可能与
    双精度
    重复。由于舍入错误,这不太可能给出您期望的答案。最好重新编写测试以避免
    =
    public static void doThis(Double n) {