找一个数字是否是Fibonacci?在Java中

时间:2014-12-30 12:20:56

标签: java fibonacci

问题定义

给出一个数字来判断它的Fibonacci数字是否合适。

输入

  1. 测试用例数1< = T< = 10 ^ 10。
  2. 跟随T行,每行包含N个整数。
  3. 示例输入

    3

    5

    7

    8

    示例输出

    IsFibo

    IsNotFibo

    IsFibo

    此问题的代码如下所示

    import java.io.*;
    import java.util.*;
    import java.text.*;
    import java.math.*;
    import java.util.regex.*;
    
    public class Solution {
    
    public static void main(String[] args) throws IOException {
     /* Enter your code here. Read input from STDIN. Print output to STDOUT */   
     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)
    {
      double one = Math.sqrt((5*n*n)+4);
    
      double two = Math.sqrt((5*n*n)-4);
      if(one % 1 == 0 || two % 1 == 0)
        {
        System.out.println("IsFibo");
        }
      else
        {
        System.out.println("IsNotFibo");
    
    
        }
    }
    }
    

    我在此链接中提供了使用Math.sqrt((5*n*n)-4)Math.sqrt((5*n*n)+4)的原因 www.fq.math.ca/Scanned/10-4/advanced10-4.pdf pagenumber 418.

    这怎么不适用于所有情况,大多数情况都失败了,我不明白为什么?

4 个答案:

答案 0 :(得分:0)

尝试@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
}

在你的情况下,我认为你应该像@rossum建议的那样将double转换为int。

答案 1 :(得分:0)

d % 1 == 0对于任何双d来说都不是一个完全可靠的测试,因为例如Math.sqrt的一些细微不准确可能会给你d = 2.000000004或者某些东西而不是2。相反,您应该与容差进行比较,例如d % 1 < 0.001如果d始终为正。

答案 2 :(得分:0)

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");

        }
    }
}

答案 3 :(得分:0)

实际答案是将int类型更改为double,同时将值读取为

Double tc = Double.parseDouble(br.readLine());

并将double传递给函数doThis

public static void doThis(Double n) {

现在它完美无缺